/** * Copyright 2025 LY Corporation * * LY Corporation licenses this file to you under the Apache License, * version 2.0 (the "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at: * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ const dynamicFieldValueSchema = { oneOf: [ { type: 'string' }, { type: 'number' }, { type: 'array', items: { type: 'string' } }, { type: 'null' }, ], description: 'The value type is determined by the channel field format. Select and date fields may be null.', }; export const DYNAMIC_FEEDBACK_REQUEST_SCHEMA = { type: 'object', description: 'Dynamic feedback fields. Use GET /projects/{projectId}/channels/{channelId}/fields to discover the accepted keys, formats, and select options.', additionalProperties: dynamicFieldValueSchema, properties: { title: { type: 'string', example: 'Feedback title' }, contents: { type: 'string', example: 'Feedback contents' }, Category: { type: 'string', example: 'ERROR_QNA' }, IP: { type: 'string', example: '192.168.0.10' }, MAC_address: { type: 'string', example: '00:1A:2B:3C:4D:5E' }, issueNames: { type: 'array', items: { type: 'string' }, description: 'Optional issue names to connect. This control field is used for issue linking and is not saved as a feedback field.', example: ['Login error'], }, }, example: { title: 'Feedback title', contents: 'Feedback contents', Category: 'ERROR_QNA', IP: '192.168.0.10', MAC_address: '00:1A:2B:3C:4D:5E', issueNames: ['Login error'], }, }; export const DYNAMIC_FEEDBACK_MULTIPART_SCHEMA = { type: 'object', description: 'Multipart feedback input. Non-file parts use the channel field keys; the images field accepts repeated binary files of any type.', additionalProperties: { type: 'string' }, properties: { title: { type: 'string', example: 'Feedback title' }, contents: { type: 'string', example: 'Feedback contents' }, issueNames: { type: 'string', description: 'JSON array or repeated value depending on the client.', example: '["Login error"]', }, images: { type: 'array', items: { type: 'string', format: 'binary' }, description: 'Repeated file attachments. Any file type is accepted within the upload limits.', }, }, }; export const DYNAMIC_FEEDBACK_ITEM_SCHEMA = { type: 'object', description: 'Feedback item. Channel field values are returned as top-level dynamic properties.', additionalProperties: dynamicFieldValueSchema, properties: { id: { type: 'number', example: 34 }, createdAt: { type: 'string', format: 'date-time', example: '2026-08-25T09:00:00.000Z', }, updatedAt: { type: 'string', format: 'date-time', example: '2026-08-25T09:30:00.000Z', }, issues: { type: 'array', items: { type: 'object', properties: { id: { type: 'number', example: 13 }, name: { type: 'string', example: 'Login error' }, status: { type: 'string', example: 'IN_PROGRESS' }, }, }, }, }, }; export const DYNAMIC_FEEDBACK_PAGINATION_SCHEMA = { type: 'object', properties: { items: { type: 'array', items: DYNAMIC_FEEDBACK_ITEM_SCHEMA, }, meta: { type: 'object', properties: { itemCount: { type: 'number', example: 10 }, totalItems: { type: 'number', example: 35 }, itemsPerPage: { type: 'number', example: 10 }, currentPage: { type: 'number', example: 1 }, totalPages: { type: 'number', example: 4 }, }, }, }, }; export const DYNAMIC_FEEDBACK_QUERY_VALUE_SCHEMA = { oneOf: [ { type: 'string' }, { type: 'number' }, { type: 'array', items: { oneOf: [{ type: 'string' }, { type: 'number' }] }, }, { type: 'object', properties: { gte: { type: 'string', example: '2026-08-01' }, lt: { type: 'string', example: '2026-09-01' }, }, }, ], };