openapi: 3.0.1
info:
  title: Fundacred - API Renovação
  description: Documentação para a API renewal-api
  contact:
    name: Infra Fundacred
    email: infra@fundacred.org.br
  version: '1.1'
servers:
  - url: https://tst-api.fundacred.org.br/auth-server
    description: TST
  - url: https://hml-api.fundacred.org.br/auth-server
    description: HML
  - url: https://api.fundacred.org.br/auth-server
    description: PRD
x-tagGroups:
  - name: Segurança & Acesso
    tags:
      - Autenticação
      - Refresh
  - name: Gestão de Usuários
    tags:
      - Cadastro
  - name: Sistema
    tags:
      - Health & Error
tags:
  - name: Cadastro
    description: Operações relacionadas ao usuário e perfil
  - name: Autenticação
    description: Login, Logout e validação de sessão
  - name: Refresh
    description: Renovação de tokens JWT
paths:
  /login:
    post:
      tags:
        - Autenticação
      description: Login do usuário
      operationId: login
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LoginInDto'
        required: true
      responses:
        '200':
          description: Sucesso ao solicitar autenticação
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/LoginOutDto'
        '400':
          description: Requisição incorreta
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/LoginOutDto'
        '401':
          description: Requisição não autorizada
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/LoginOutDto'
  /signup:
    post:
      tags:
        - Cadastro
      description: Cadastro de novo usuário
      operationId: signUp
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SignUpInDto'
        required: true
      responses:
        '201':
          description: Sucesso criar um novo usuário
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/SignUpOutDto'
        '400':
          description: Requisição incorreta
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/SignUpOutDto'
        '401':
          description: Requisição não autorizada
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/SignUpOutDto'
        '409':
          description: Usuário já existe
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/SignUpOutDto'
  /change-password:
    put:
      tags:
        - Autenticação
      description: Mudança de senha
      operationId: changePassword
      parameters:
        - name: auth
          in: query
          required: true
          schema:
            $ref: '#/components/schemas/OAuth2AuthenticationContext'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ChangePasswordInDto'
        required: true
      responses:
        '200':
          description: Sucesso ao alterar a senha do usuário
        '400':
          description: Requisição incorreta
        '401':
          description: Requisição não autorizada
  /revoke:
    post:
      tags:
        - Autenticação
      description: Revogar token (Logout)
      operationId: revoke
      responses:
        '200':
          description: Sucesso ao revogar o token
        '401':
          description: Requisição não autorizada
  /refresh:
    post:
      tags:
        - Refresh
      description: Refresh token
      operationId: refreshToken
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RefreshTokenInDto'
        required: true
      responses:
        '200':
          description: Sucesso ao realizar o refresh token
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/RefreshTokenOutDto'
        '401':
          description: Requisição não autorizada
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/RefreshTokenOutDto'
  /validate:
    get:
      tags:
        - Autenticação
      description: Valida se o token atual é válido
      operationId: getAuthorizedUserName
      responses:
        '200':
          description: Token Válido
  /user/{userId}:
    get:
      tags:
        - Cadastro
      description: Busca dados do usuário pelo id
      operationId: getUserDetails
      parameters:
        - name: userId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Sucesso ao retornar dados do usuário
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/UserDetailsDto'
        '400':
          description: Requisição incorreta
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/UserDetailsDto'
    delete:
      tags:
        - Cadastro
      description: Remove um usuário
      operationId: deleteUser
      parameters:
        - name: userId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Usuário removido com sucesso
  /user/username:
    get:
      tags:
        - Cadastro
      description: Busca username do usuário logado
      operationId: getAuthorizedUserName_1
      responses:
        '200':
          description: Sucesso ao retornar username
          content:
            '*/*':
              schema:
                type: string
        '400':
          description: Requisição incorreta
          content:
            '*/*':
              schema:
                type: string
  /user/roles:
    get:
      tags:
        - Cadastro
      description: Busca regras de acesso do usuário
      operationId: getAuthorizedUserRoles
      responses:
        '200':
          description: Sucesso ao retornar regras
          content:
            '*/*':
              schema:
                uniqueItems: true
                type: array
                items:
                  type: string
        '400':
          description: Requisição incorreta
          content:
            '*/*':
              schema:
                uniqueItems: true
                type: array
                items:
                  type: string
  /user/me:
    get:
      tags:
        - Cadastro
      description: Busca dados do usuário logado
      operationId: getYourselfInformation
      responses:
        '200':
          description: Sucesso ao retornar dados do usuário logado
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/UserDetailsDto'
        '400':
          description: Requisição incorreta
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/UserDetailsDto'
  /error:
    get:
      tags:
        - Health & Error
      operationId: error
      responses:
        '200':
          description: OK
components:
  schemas:
    ChangePasswordInDto:
      required:
        - nova_senha
        - usuario
      type: object
      properties:
        usuario:
          type: string
        nova_senha:
          type: string
    OAuth2AuthenticationContext:
      type: object
    SignUpInDto:
      required:
        - email
        - nome
        - senha
        - usuario
      type: object
      properties:
        email:
          type: string
        usuario:
          type: string
        senha:
          type: string
        nome:
          type: string
        sobrenome:
          type: string
        perfis:
          type: array
          items:
            type: string
        cod_grupo_ies:
          type: string
        grupos:
          type: array
          items:
            type: string
            enum:
              - SystemGroupEnum.PORTAL_IES(name=Portal IES)
              - SystemGroupEnum.PORTAL_ESTUDANTE(name=Portal Estudante)
    SignUpOutDto:
      type: object
      properties:
        id:
          type: string
        email:
          type: string
        usuario:
          type: string
        regras:
          type: array
          items:
            type: string
        atributos:
          type: object
          additionalProperties:
            type: array
            items:
              type: string
        grupos:
          type: array
          items:
            type: string
        ativo:
          type: string
    RefreshTokenInDto:
      required:
        - refresh_token
      type: object
      properties:
        refresh_token:
          type: string
    RefreshTokenOutDto:
      type: object
      properties:
        access_token:
          type: string
        expires_in:
          type: integer
          format: int64
        refresh_expires_in:
          type: integer
          format: int64
        refresh_token:
          type: string
        token_type:
          type: string
    LoginInDto:
      required:
        - password
        - username
      type: object
      properties:
        username:
          type: string
        password:
          type: string
    LoginOutDto:
      type: object
      properties:
        access_token:
          type: string
        expires_in:
          type: integer
          format: int64
        refresh_expires_in:
          type: integer
          format: int64
        refresh_token:
          type: string
        token_type:
          type: string
    UserDetailsDto:
      type: object
      properties:
        id:
          type: string
        username:
          type: string
        enabled:
          type: boolean
        emailVerified:
          type: boolean
        firstName:
          type: string
        lastName:
          type: string
        email:
          type: string
  securitySchemes:
    bearerAuth:
      type: http
      description: JWT TOKEN
      in: header
      scheme: bearer
      bearerFormat: JWT
