openapi: 3.0.3 info: title: 'one-api API Documentation' description: '' version: 1.0.0 servers: - url: 'https://apione.homologa.grupofaveni.com' tags: - name: Auth description: '' - name: Department description: '' - name: Disciplinas description: "\nEndpoints para consulta e gerenciamento de disciplinas via integração ONE." - name: Domain description: '' - name: Role description: '' - name: User description: '' paths: /api/v1/auth/google/link: get: summary: 'Gera o link de autenticação do Google (via Socialite) para iniciar o fluxo de login.' operationId: geraOLinkDeAutenticaoDoGoogleviaSocialiteParaIniciarOFluxoDeLogin description: "Este endpoint recebe o URL de redirecionamento pós-login e retorna o link\ndo Google para o qual o frontend deve direcionar o usuário. O parâmetro\n'redirect_to' é usado como 'state' no OAuth para manter a segurança e\no contexto da aplicação." parameters: - in: query name: redirect_to description: 'O URL completo de redirecionamento após o login bem-sucedido. Must be a valid URL.' example: 'http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html' required: true schema: type: string description: 'O URL completo de redirecionamento após o login bem-sucedido. Must be a valid URL.' example: 'http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html' responses: 200: description: '' content: application/json: schema: type: object example: url: string properties: url: type: string example: string tags: - Auth requestBody: required: true content: application/json: schema: type: object properties: redirect_to: type: string description: 'O URL completo de redirecionamento após o login bem-sucedido (ex: https://app.dominio.com/dashboard).' example: architecto required: - redirect_to security: [] /api/v1/auth/google/callback: get: summary: 'Callback de Autenticação via Google Socialite.' operationId: callbackDeAutenticaoViaGoogleSocialite description: "Este endpoint processa o retorno do Google após a autorização do usuário.\nEle localiza ou cria o usuário na base de dados, gera um Personal Access Token (Sanctum)\ne redireciona o usuário de volta para o endereço fornecido no parâmetro 'state' da query string." parameters: - in: query name: state description: 'A URL de destino para onde o usuário deve ser redirecionado após o login.' example: meu-front.com required: true schema: type: string description: 'A URL de destino para onde o usuário deve ser redirecionado após o login.' example: meu-front.com responses: 500: description: '' content: application/json: schema: type: object example: message: 'Server Error' properties: message: type: string example: 'Server Error' tags: - Auth security: [] /api/v1/auth/logout: post: summary: '' operationId: postApiV1AuthLogout description: '' parameters: [] responses: { } tags: - Auth security: [] /api/v1/departments: get: summary: 'Listar todos os departamentos.' operationId: listarTodosOsDepartamentos description: "Retorna uma coleção simples contendo o ID e o nome de todos\nos departamentos cadastrados, ordenados alfabeticamente." parameters: [] responses: 200: description: '' content: application/json: schema: type: array items: type: object properties: id: type: integer example: 1 name: type: string example: Financeiro example: - id: 1 name: Financeiro - id: 2 name: Tecnologia tags: - Department security: [] /api/v1/disciplines: get: summary: '' operationId: getApiV1Disciplines description: '' parameters: - in: query name: name description: 'Filtra pelo nome parcial da disciplina. validation.max.' example: Anatomia required: false schema: type: string description: 'Filtra pelo nome parcial da disciplina. validation.max.' example: Anatomia - in: query name: page description: 'Número da página para navegação. validation.min.' example: 1 required: false schema: type: integer description: 'Número da página para navegação. validation.min.' example: 1 - in: query name: per_page description: 'Itens por página (Máx: 100). validation.min validation.max.' example: 15 required: false schema: type: integer description: 'Itens por página (Máx: 100). validation.min validation.max.' example: 15 - in: query name: order description: Ordenação. example: asc required: false schema: type: string description: Ordenação. example: asc enum: - asc - desc - ASC - DESC - in: query name: sort_by description: 'Coluna para ordenação.' example: name required: false schema: type: string description: 'Coluna para ordenação.' example: name enum: - name - id - created_at - source - term - in: header name: X-Domain description: '' example: 'faveni Identificador do Tenant/Domínio (Obrigatório para definir o contexto da requisição).' schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Disciplinas security: [] '/api/v1/disciplines/{id}': get: summary: '' operationId: getApiV1DisciplinesId description: '' parameters: - in: header name: X-Domain description: '' example: 'faveni Identificador do Tenant/Domínio (Obrigatório para definir o contexto da requisição).' schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Disciplinas security: [] parameters: - in: path name: id description: 'The ID of the discipline.' example: architecto required: true schema: type: string '/api/v1/disciplines/{id}/curriculum': get: summary: '' operationId: getApiV1DisciplinesIdCurriculum description: '' parameters: - in: query name: name description: 'Filtro textual pelo nome da matriz curricular (busca parcial).' example: 'Enfermagem 01/2026' required: false schema: type: string description: 'Filtro textual pelo nome da matriz curricular (busca parcial).' example: 'Enfermagem 01/2026' - in: query name: order description: 'Direção da ordenação: "asc" (crescente) ou "desc" (decrescente).' example: asc required: false schema: type: string description: 'Direção da ordenação: "asc" (crescente) ou "desc" (decrescente).' example: asc - in: query name: sort_by description: 'Coluna utilizada para ordenação. Aceita campos da matriz (name, source) ou do vínculo (term).' example: term required: false schema: type: string description: 'Coluna utilizada para ordenação. Aceita campos da matriz (name, source) ou do vínculo (term).' example: term enum: - id - name - created_at - updated_at - in: query name: page description: 'Número da página atual para navegação.' example: 1 required: false schema: type: integer description: 'Número da página atual para navegação.' example: 1 - in: query name: per_page description: 'Quantidade de itens retornados por página (Máx: 100).' example: 15 required: false schema: type: integer description: 'Quantidade de itens retornados por página (Máx: 100).' example: 15 - in: header name: X-Domain description: '' example: 'faveni Identificador do Tenant/Domínio (Obrigatório para definir o contexto da requisição).' schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Disciplinas security: [] parameters: - in: path name: id description: 'The ID of the discipline.' example: architecto required: true schema: type: string /api/v1/domains: get: summary: '' operationId: getApiV1Domains description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Domain security: [] /api/v1/roles: get: summary: 'Listar todos as roles.' operationId: listarTodosAsRoles description: "Retorna uma coleção simples contendo o ID e o nome de todos\nas roles (Cargos) cadastrados, ordenados alfabeticamente." parameters: [] responses: 200: description: '' content: application/json: schema: type: array items: type: object properties: id: type: integer example: 1 name: type: string example: Admin example: - id: 1 name: Admin - id: 2 name: Diretor tags: - Role security: [] /api/v1/me: get: summary: 'Obter perfil do usuário autenticado.' operationId: obterPerfilDoUsurioAutenticado description: "Este endpoint retorna os detalhes do usuário logado, incluindo o cargo (role) único\ne o nome do departamento vinculado ao seu registro de funcionário." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: uuid: 9b12e345-e89b-12d3-a456-426614174000 name: 'João Silva' email: joao.silva@empresa.com.br avatar_url: lh3.googleusercontent.com... role: id: 2 name: gerente department: id: 2 name: Marketing status: active created_at: '2025-12-19T16:10:00Z' updated_at: '2025-12-19T16:10:00Z' properties: uuid: type: string example: 9b12e345-e89b-12d3-a456-426614174000 name: type: string example: 'João Silva' email: type: string example: joao.silva@empresa.com.br avatar_url: type: string example: lh3.googleusercontent.com... role: type: object properties: id: type: integer example: 2 name: type: string example: gerente department: type: object properties: id: type: integer example: 2 name: type: string example: Marketing status: type: string example: active created_at: type: string example: '2025-12-19T16:10:00Z' updated_at: type: string example: '2025-12-19T16:10:00Z' 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - User put: summary: 'Atualizar perfil do usuário autenticado.' operationId: atualizarPerfilDoUsurioAutenticado description: "Este endpoint permite que o usuário logado atualize suas informações pessoais.\nA operação é realizada de forma atômica (transação)." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: uuid: 9b12e345-e89b-12d3-a456-426614174000 name: 'João Silva' email: joao.silva@empresa.com avatar_url: lh3.googleusercontent.com... role_id: 1 department: Tecnologia status: active created_at: '2025-12-19T16:15:00Z' updated_at: '2025-12-19T16:20:00Z' properties: uuid: type: string example: 9b12e345-e89b-12d3-a456-426614174000 name: type: string example: 'João Silva' email: type: string example: joao.silva@empresa.com avatar_url: type: string example: lh3.googleusercontent.com... role_id: type: integer example: 1 department: type: string example: Tecnologia status: type: string example: active created_at: type: string example: '2025-12-19T16:15:00Z' updated_at: type: string example: '2025-12-19T16:20:00Z' 422: description: '' content: application/json: schema: type: object example: message: 'The given data was invalid.' errors: department_id: - 'O departamento selecionado é inválido.' role: - 'O cargo selecionado é inválido.' properties: message: type: string example: 'The given data was invalid.' errors: type: object properties: department_id: type: array example: - 'O departamento selecionado é inválido.' items: type: string role: type: array example: - 'O cargo selecionado é inválido.' items: type: string 500: description: '' content: application/json: schema: type: object example: message: 'Erro interno ao atualizar perfil.' properties: message: type: string example: 'Erro interno ao atualizar perfil.' tags: - User requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Nome completo do usuário.' example: 'João Silva' role_id: type: integer description: 'ID da role do funcionário a ser sincronizada.' example: 1 department_id: type: integer description: 'ID do departamento vinculado ao funcionário.' example: 2 email: type: string description: 'Endereço de e-mail.' example: joao.silva@empresa.com /api/v1/users: get: summary: 'Lista usuários paginados.' operationId: listaUsuriosPaginados description: "Rota: GET /v1/users\nDescrição: Lista usuários paginados com filtros (status) e ordena mediante ao nome da coluna." parameters: - in: query name: status description: 'optional Filtra por status.' example: approved required: false schema: type: string description: 'optional Filtra por status.' example: approved - in: query name: order_by description: 'optional Campo para ordenação.' example: name required: false schema: type: string description: 'optional Campo para ordenação.' example: name - in: query name: direction description: 'optional Direção da ordenação.' example: asc required: false schema: type: string description: 'optional Direção da ordenação.' example: asc - in: query name: page description: 'optional Página atual.' example: 1 required: false schema: type: integer description: 'optional Página atual.' example: 1 - in: query name: limit description: 'optional Itens por página.' example: 10 required: false schema: type: integer description: 'optional Itens por página.' example: 10 responses: 200: description: '' content: text/plain: schema: type: string example: "{\n \"data\": [\n { \"uuid\":\"...\", \"name\":\"...\", \"email\":\"...\", \"role\":\"admin\", \"department\":\"Tecnologia\", \"status\":\"active\" }\n ],string\n \"meta\": { \"current_page\":1, \"last_page\":10, \"per_page\":15, \"total\":150 }\n}" tags: - User '/api/v1/users/{user_uuid}': get: summary: 'Obter perfil de determinado usuário.' operationId: obterPerfilDeDeterminadoUsurio description: 'Este endpoint permite que o adminstrador consiga as informações de um determinado usuário' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: uuid: d8933aba-2cb7-44d2-925b-7337226b4934 name: 'Juliana Paes' email: juliana.paes@empresa.com avatar_url: null role: id: 2 name: gerente department: id: 2 name: Marketing status: pending is_active: false email_verified_at: '2025-12-31T08:43:10.000000Z' created_at: '2025-12-31T08:43:10.000000Z' updated_at: '2025-12-31T08:43:10.000000Z' properties: uuid: type: string example: d8933aba-2cb7-44d2-925b-7337226b4934 name: type: string example: 'Juliana Paes' email: type: string example: juliana.paes@empresa.com avatar_url: type: string example: null role: type: object properties: id: type: integer example: 2 name: type: string example: gerente department: type: object properties: id: type: integer example: 2 name: type: string example: Marketing status: type: string example: pending is_active: type: boolean example: false email_verified_at: type: string example: '2025-12-31T08:43:10.000000Z' created_at: type: string example: '2025-12-31T08:43:10.000000Z' updated_at: type: string example: '2025-12-31T08:43:10.000000Z' 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. 404: description: '' content: application/json: schema: type: object example: message: 'Usuário não encontrado.' properties: message: type: string example: 'Usuário não encontrado.' tags: - User put: summary: 'Atualizar perfil de determinado usuário.' operationId: atualizarPerfilDeDeterminadoUsurio description: 'Este endpoint permite que o adminstrador atualize as informações de um usuário.' parameters: [] responses: 200: description: '' content: text/plain: schema: type: string example: "{\n'message': 'Usuário atualizado com sucesso.',\n}" 422: description: '' content: application/json: schema: type: object example: message: 'The given data was invalid.' errors: department_id: - 'O departamento selecionado é inválido.' role: - 'O cargo selecionado é inválido.' properties: message: type: string example: 'The given data was invalid.' errors: type: object properties: department_id: type: array example: - 'O departamento selecionado é inválido.' items: type: string role: type: array example: - 'O cargo selecionado é inválido.' items: type: string 500: description: '' content: application/json: schema: type: object example: message: 'Erro interno ao atualizar usuário.' properties: message: type: string example: 'Erro interno ao atualizar usuário.' tags: - User requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Nome completo do usuário.' example: 'João Silva' role_id: type: integer description: 'ID da role do funcionário a ser sincronizada.' example: 1 department_id: type: integer description: 'ID do departamento vinculado ao funcionário.' example: 2 is_active: type: boolean description: 'informa se o usário está ativo ou não.' example: true email: type: string description: 'Endereço de e-mail.' example: joao.silva@empresa.com parameters: - in: path name: user_uuid description: '' example: 2 required: true schema: type: integer '/api/v1/users/{user_uuid}/moderation': patch: summary: 'Moderação de usuário (aprovar/rejeitar).' operationId: moderaoDeUsurioaprovarrejeitar description: "Este endpoit permite que um administrador aprove ou rejeite um usuário pendente.\ncaso aprovado o campo 'approved_by' será preenchido com o id do administrador que realizou a ação.\ncaso rejeitado o usuário será excluído." parameters: [] responses: 200: description: '' content: text/plain: schema: type: string example: "{\n'message' => 'Moderação realizada com sucesso.',\n}" 422: description: '' content: application/json: schema: type: object example: message: 'Este usuário já foi processado e não está mais pendente.' properties: message: type: string example: 'Este usuário já foi processado e não está mais pendente.' 500: description: '' content: text/plain: schema: type: string example: "{\n'message' => 'Erro interno ao processar a moderação do usuário.',\n'error' => 'Detalhes do erro',\n}" tags: - User requestBody: required: true content: application/json: schema: type: object properties: status: type: string description: 'options: approved | rejected.' example: architecto required: - status parameters: - in: path name: user_uuid description: '' example: 2 required: true schema: type: integer