/**
 * This file is part of the NocoBase (R) project.
 * Copyright (c) 2020-2024 NocoBase Co., Ltd.
 * Authors: NocoBase Team.
 *
 * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
 * For more information, please refer to: https://www.nocobase.com/agreement.
 */

export default {
  openapi: '3.0.2',
  info: {
    title: 'NocoBase API - ACL plugin',
  },
  paths: {
    '/roles:list': {
      get: {
        tags: ['roles'],
        description: '',
        parameters: [],
        responses: {
          200: {
            description: 'ok',
            content: {
              'application/json': {
                schema: {
                  type: 'array',
                  items: {
                    $ref: '#/components/schemas/role',
                  },
                },
              },
            },
          },
        },
      },
    },
    '/roles:get': {
      get: {
        tags: ['roles'],
        description: '',
        parameters: [
          {
            name: 'filterByTk',
            in: 'query',
            description: 'role name',
            required: true,
            schema: {
              type: 'string',
            },
          },
        ],
        responses: {
          200: {
            description: 'ok',
            content: {
              'application/json': {
                schema: {
                  $ref: '#/components/schemas/role',
                },
              },
            },
          },
        },
      },
    },
    '/roles:create': {
      post: {
        tags: ['roles'],
        description: '',
        requestBody: {
          content: {
            'application/json': {
              schema: {
                $ref: '#/components/schemas/role',
              },
            },
          },
        },
        responses: {
          '200': {
            description: 'OK',
            content: {
              'application/json': {
                schema: {
                  $ref: '#/components/schemas/role',
                },
              },
            },
          },
        },
      },
    },
    '/roles:update': {
      post: {
        tags: ['roles'],
        description: '',
        parameters: [
          {
            name: 'filterByTk',
            in: 'query',
            description: 'role name',
            required: true,
            schema: {
              type: 'string',
            },
          },
        ],
        requestBody: {
          content: {
            'application/json': {
              schema: {
                $ref: '#/components/schemas/role',
              },
            },
          },
        },
        responses: {
          200: {
            description: 'ok',
            content: {
              'application/json': {
                schema: {
                  $ref: '#/components/schemas/role',
                },
              },
            },
          },
        },
      },
    },
    '/roles:destroy': {
      post: {
        tags: ['roles'],
        description: '',
        parameters: [
          {
            name: 'filterByTk',
            in: 'query',
            description: 'role name',
            required: true,
            schema: {
              type: 'string',
            },
          },
        ],
        responses: {
          '200': {
            description: 'OK',
          },
        },
      },
    },
    '/roles:check': {
      get: {
        tags: ['roles'],
        description: 'return current user role',
        responses: {
          200: {
            description: 'ok',
            content: {
              'application/json': {
                schema: {
                  $ref: '#/components/schemas/role',
                },
              },
            },
          },
        },
      },
    },
    '/roles:setDefaultRole': {
      post: {
        tags: ['roles'],
        description: 'set default role for new user',
        requestBody: {
          content: {
            'application/json': {
              schema: {
                type: 'object',
                properties: {
                  roleName: {
                    type: 'string',
                  },
                },
              },
            },
          },
        },
        responses: {
          '200': {
            description: 'OK',
          },
        },
      },
    },
    '/roles/{roleName}/collections:list': {
      get: {
        tags: ['roles.collections'],
        description: 'list permissions of collections for role by roleName',
        parameters: [
          {
            name: 'filterByTk',
            in: 'query',
            description: 'role name',
            required: true,
            schema: {
              type: 'string',
            },
          },
        ],
        responses: {
          '200': {
            description: 'OK',
            content: {
              'application/json': {
                schema: {
                  type: 'array',
                  items: {
                    type: 'object',
                    properties: {
                      type: {
                        type: 'string',
                        description: 'collection',
                      },
                      name: {
                        type: 'string',
                        description: 'collection name',
                      },
                      collectionName: {
                        type: 'string',
                        description: 'collection name',
                      },
                      title: {
                        type: 'string',
                        description: 'collection title',
                      },
                      roleName: {
                        type: 'string',
                        description: 'role name',
                      },
                      usingConfig: {
                        type: 'string',
                        enum: ['resourceAction', 'strategy'],
                        description: 'resourceAction: 单独配置, strategy: 全局策略',
                      },
                      exists: {
                        type: 'boolean',
                        description: '是否存在单独配置的权限',
                      },
                    },
                  },
                },
              },
            },
          },
        },
      },
    },
    '/availableActions:list': {
      get: {
        tags: ['availableActions'],
        description: 'available actions of resource in current system',
        parameters: [],
        responses: {
          '200': {
            description: 'OK',
            content: {
              'application/json': {
                schema: {
                  type: 'array',
                  items: {
                    type: 'object',
                    properties: {
                      name: {
                        type: 'string',
                        description: 'Action名称',
                      },
                      displayName: {
                        type: 'string',
                        description: 'Action显示名称',
                      },
                      allowConfigureFields: {
                        type: 'boolean',
                        description: '是否允许配置字段',
                      },
                      onNewRecord: {
                        type: 'string',
                        description: '是否是新记录的Action',
                      },
                      type: {
                        type: 'string',
                        description: 'new-data 或者 old-data',
                      },
                      aliases: {
                        type: 'array',
                        items: {
                          type: 'string',
                        },
                        description: '别名',
                      },
                    },
                  },
                },
              },
            },
          },
        },
      },
    },
  },
  components: {
    schemas: {
      role: {
        type: 'object',
        properties: {
          title: {
            type: 'string',
            description: '角色名称',
          },
          name: {
            type: 'string',
            description: '角色标识',
          },
          description: {
            type: 'string',
            description: '角色描述',
          },
          hidden: {
            type: 'boolean',
            description: '是否隐藏',
          },
          default: {
            type: 'boolean',
            description: '是否默认',
          },
          allowConfigure: {
            type: 'boolean',
            description: '是否允许配置',
          },
          allowNewMenu: {
            type: 'boolean',
            description: '是否允许新建菜单',
          },
          snippets: {
            type: 'array',
            items: {
              type: 'string',
            },
            description: '接口权限',
          },
          strategy: {
            type: 'array',
            description: '数据表权限策略',
            items: {
              type: 'object',
              properties: {
                actions: {
                  type: 'array',
                  items: {
                    type: 'string',
                  },
                  description: '操作',
                },
              },
            },
          },
          createdAt: {
            type: 'string',
            format: 'date-time',
            description: '创建时间',
          },
          updatedAt: {
            type: 'string',
            format: 'date-time',
            description: '更新时间',
          },
        },
      },
    },
  },
};
