u
This commit is contained in:
@@ -23,9 +23,59 @@ function categoryErrorStatus(error) {
|
||||
*/
|
||||
export function register(app, basePath = '') {
|
||||
/**
|
||||
* @route GET /category/tree
|
||||
* @description Returns the category tree for the authenticated user's selected company.
|
||||
* @returns {Object} 200 - `{ languageId, tree, articles }`
|
||||
* @openapi
|
||||
* /category/tree:
|
||||
* get:
|
||||
* tags: [Category]
|
||||
* summary: Category tree
|
||||
* description: Returns the category tree for the authenticated user's selected company.
|
||||
* security:
|
||||
* - cookieAuth: []
|
||||
* x-markdown: category/tree.md
|
||||
* responses:
|
||||
* 200:
|
||||
* description: Tree and articles for the selected company
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* type: object
|
||||
* properties:
|
||||
* languageId:
|
||||
* type: integer
|
||||
* tree:
|
||||
* type: array
|
||||
* items:
|
||||
* type: object
|
||||
* additionalProperties: true
|
||||
* articles:
|
||||
* type: array
|
||||
* items:
|
||||
* type: object
|
||||
* additionalProperties: true
|
||||
* 400:
|
||||
* description: No company selected
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* $ref: '#/components/schemas/Error'
|
||||
* 401:
|
||||
* description: Unauthorized
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* $ref: '#/components/schemas/Error'
|
||||
* 403:
|
||||
* description: Not authorized
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* $ref: '#/components/schemas/Error'
|
||||
* 404:
|
||||
* description: Company not found
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* $ref: '#/components/schemas/Error'
|
||||
*/
|
||||
app.get(`${basePath}/category/tree`, async (req, res) => {
|
||||
const companyId = req.user.selectedCompanyId;
|
||||
@@ -44,11 +94,64 @@ export function register(app, basePath = '') {
|
||||
});
|
||||
|
||||
/**
|
||||
* @route POST /category
|
||||
* @description Creates a category under an authorized parent.
|
||||
* @body {number} parentId
|
||||
* @body {string} name
|
||||
* @returns {Object} 201 - `{ category: { id, parentId, sort, name } }`
|
||||
* @openapi
|
||||
* /category:
|
||||
* post:
|
||||
* tags: [Category]
|
||||
* summary: Create category
|
||||
* description: Creates a category under an authorized parent.
|
||||
* security:
|
||||
* - cookieAuth: []
|
||||
* x-markdown: category/create.md
|
||||
* requestBody:
|
||||
* required: true
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* type: object
|
||||
* required: [parentId, name]
|
||||
* properties:
|
||||
* parentId:
|
||||
* type: integer
|
||||
* name:
|
||||
* type: string
|
||||
* example:
|
||||
* parentId: 1
|
||||
* name: New category
|
||||
* responses:
|
||||
* 201:
|
||||
* description: Created
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* type: object
|
||||
* properties:
|
||||
* category:
|
||||
* $ref: '#/components/schemas/Category'
|
||||
* 400:
|
||||
* description: Validation error
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* $ref: '#/components/schemas/Error'
|
||||
* 401:
|
||||
* description: Unauthorized
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* $ref: '#/components/schemas/Error'
|
||||
* 403:
|
||||
* description: Not authorized
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* $ref: '#/components/schemas/Error'
|
||||
* 404:
|
||||
* description: Parent not found
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* $ref: '#/components/schemas/Error'
|
||||
*/
|
||||
app.post(`${basePath}/category`, async (req, res) => {
|
||||
const parent = parsePositiveInt(req.body?.parentId, 'parentId');
|
||||
@@ -76,9 +179,53 @@ export function register(app, basePath = '') {
|
||||
});
|
||||
|
||||
/**
|
||||
* @route GET /category/:id/articles
|
||||
* @description Returns articles in a category the user is authorized for.
|
||||
* @returns {Object} 200 - `{ articles }`
|
||||
* @openapi
|
||||
* /category/{id}/articles:
|
||||
* get:
|
||||
* tags: [Category]
|
||||
* summary: Articles in category
|
||||
* description: Returns articles in a category the user is authorized for.
|
||||
* security:
|
||||
* - cookieAuth: []
|
||||
* x-markdown: category/articles.md
|
||||
* parameters:
|
||||
* - in: path
|
||||
* name: id
|
||||
* required: true
|
||||
* schema:
|
||||
* type: integer
|
||||
* description: Category id
|
||||
* responses:
|
||||
* 200:
|
||||
* description: Articles list
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* type: object
|
||||
* properties:
|
||||
* articles:
|
||||
* type: array
|
||||
* items:
|
||||
* type: object
|
||||
* additionalProperties: true
|
||||
* 400:
|
||||
* description: Invalid id
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* $ref: '#/components/schemas/Error'
|
||||
* 401:
|
||||
* description: Unauthorized
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* $ref: '#/components/schemas/Error'
|
||||
* 403:
|
||||
* description: Not authorized
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* $ref: '#/components/schemas/Error'
|
||||
*/
|
||||
app.get(`${basePath}/category/:id/articles`, async (req, res) => {
|
||||
const parsed = parsePositiveInt(req.params.id, 'id');
|
||||
@@ -97,9 +244,43 @@ export function register(app, basePath = '') {
|
||||
});
|
||||
|
||||
/**
|
||||
* @route DELETE /category/:id
|
||||
* @description Deletes a category the user is authorized for (not the company root).
|
||||
* @returns {Object} 204 - No content
|
||||
* @openapi
|
||||
* /category/{id}:
|
||||
* delete:
|
||||
* tags: [Category]
|
||||
* summary: Delete category
|
||||
* description: Deletes a category the user is authorized for (not the company root).
|
||||
* security:
|
||||
* - cookieAuth: []
|
||||
* x-markdown: category/delete.md
|
||||
* parameters:
|
||||
* - in: path
|
||||
* name: id
|
||||
* required: true
|
||||
* schema:
|
||||
* type: integer
|
||||
* description: Category id
|
||||
* responses:
|
||||
* 204:
|
||||
* description: Deleted
|
||||
* 400:
|
||||
* description: Invalid id or cannot delete root
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* $ref: '#/components/schemas/Error'
|
||||
* 401:
|
||||
* description: Unauthorized
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* $ref: '#/components/schemas/Error'
|
||||
* 403:
|
||||
* description: Not authorized
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* $ref: '#/components/schemas/Error'
|
||||
*/
|
||||
app.delete(`${basePath}/category/:id`, async (req, res) => {
|
||||
const parsed = parsePositiveInt(req.params.id, 'id');
|
||||
|
||||
Reference in New Issue
Block a user