openapi: 3.0.1
info:
  version: '0.1'
  title: 'DC Project'
  description: 'A free comunity program for create constitution'

paths:
  /register:
    post:
      summary: Create account
      tags:
        - authentification
      operationId: register
      requestBody:
        $ref: '#/components/requestBodies/RegisterRequest'

      responses:
        200:
          description: User created and JWT returned
          content:
            text/plain:
              example:
                eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJBdXRoZW50aWNhdGlvbiIsImlzcyI6ImRjLXByb2plY3QuZnIiLCJpZCI6ImQ1NDRhNmE4LWJhYjgtNDU2MC05NWIxLThhZjAyMDNkOTEwNCIsImV4cCI6MTU2NzA3Mzc0Mn0.0VTetv8fZFjVgpJ-bwJpidGNHJUOmgj8vuZcZXzwnLa7TtFwcXWvh3bDPYHqB66nmOfXyM57XnHDbmRwtipCag

  /login:
    post:
      summary: sign in
      tags:
        - authentification
      operationId: login
      requestBody:
        $ref: '#/components/requestBodies/LoginRequest'
      responses:
        200:
          description: return JWT
          content:
            text/plain:
              example:
                eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJBdXRoZW50aWNhdGlvbiIsImlzcyI6ImRjLXByb2plY3QuZnIiLCJpZCI6ImQ1NDRhNmE4LWJhYjgtNDU2MC05NWIxLThhZjAyMDNkOTEwNCIsImV4cCI6MTU2NzA3Mzc0Mn0.0VTetv8fZFjVgpJ-bwJpidGNHJUOmgj8vuZcZXzwnLa7TtFwcXWvh3bDPYHqB66nmOfXyM57XnHDbmRwtipCag
  /sso:
    post:
      summary: Send email with JWT
      tags:
        - authentification
      operationId: sso
      requestBody:
        content:
          application/json:
            schema:
              properties:
                email:
                  type: string
                  format: email
                  description: email to send the token
                  example:
                    my.email@dc-project.fr
                url:
                  type: string
                  description: url tu redirect with the token
                  example:
                    http://dc-project.fr/sso

      responses:
        204:
          description: email send
        404:
          description: no user with this email

  /citizens/current:
    get:
      security:
        - JWTAuth: []
      summary: Get Citizen
      tags:
        - citizen
      operationId: getCurrentCitizen
      responses:
        200:
          description: The Citizen object
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CitizenResponse'
  /citizens/{citizen}:
    parameters:
      - $ref: '#/components/parameters/citizen'
    get:
      security:
        - JWTAuth: []
      summary: Get Citizen
      tags:
        - citizen
      operationId: getCitizen
      responses:
        200:
          description: The Citizen object
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CitizenResponse'
        404:
          description: Citizen not found
        401:
          $ref: '#/components/responses/401'
  /citizens/{citizen}/votes:
    parameters:
      - $ref: '#/components/parameters/citizen'
    get:
      security:
        - JWTAuth: []
      summary: Get Citizen
      tags:
        - vote
        - citizen
      operationId: getCitizenVotes
      parameters:
        - name: id
          in: query
          required: true
          example:
            - 1329ab90-edae-cfed-f863-c8cb069fa327
            - cab54e50-ce85-bba0-da23-fc9f75feeaf5
          schema:
            type: array
            items:
              type: string
              format: uuid
      responses:
        200:
          description: The Votes objects
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/VoteResponse'
        404:
          description: Citizen not found
        401:
          $ref: '#/components/responses/401'
  /citizens/{citizen}/password/change:
    parameters:
      - $ref: '#/components/parameters/citizen'
    put:
      security:
        - JWTAuth: []
      summary: Change Citizen Password
      tags:
        - citizen
      operationId: changePassword
      requestBody:
        required: true
        content:
          application/json:
            schema:
              properties:
                old_password:
                  type: string
                  format: password
                  required: true
                  example:
                    azerty
                new_password:
                  type: string
                  format: password
                  required: true
                  example:
                    qwerty
      responses:
        201:
          description: Password changed
        404:
          description: Citizen not found
        401:
          $ref: '#/components/responses/401'

  /citizens:
    get:
      security:
        - JWTAuth: []
      summary: Get all citizens
      tags:
        - citizen
      operationId: getCitizens
      parameters:
        - $ref: '#/components/parameters/page'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/sort'
        - $ref: '#/components/parameters/direction'
        - $ref: '#/components/parameters/search'
      responses:
        200:
          description: The Citizen objects
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Paginated'
                  - type: object
                    properties:
                      result:
                        type: array
                        items:
                          $ref: '#/components/schemas/CitizenResponse'
        401:
          $ref: '#/components/responses/401'

  /articles:
    get:
      summary: Get all articles
      tags:
        - article
      operationId: getArticles
      parameters:
        - $ref: '#/components/parameters/page'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/articleSort'
        - $ref: '#/components/parameters/direction'
        - $ref: '#/components/parameters/search'
        - $ref: '#/components/parameters/createdBy'
      responses:
        200:
          description: The Article objects
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Paginated'
                  - type: object
                    properties:
                      result:
                        type: array
                        items:
                          $ref: '#/components/schemas/ArticleResponse'
    post:
      security:
        - JWTAuth: []
      summary: Create new Article
      tags:
        - article
      operationId: insertArticle
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ArticleRequest'
      responses:
        201:
          description: Article created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ArticleResponse'
        401:
          $ref: '#/components/responses/401'
  /articles/{article}:
    parameters:
      - $ref: '#/components/parameters/article'
    get:
      security:
        - {}
        - JWTAuth: []
      summary: Get one article
      tags:
        - article
      operationId: getArticle
      responses:
        200:
          description: The Article objects
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ArticleResponse'
  /articles/{article}/versions:
    parameters:
      - $ref: '#/components/parameters/article'
    get:
      summary: Get all versions of articles
      tags:
        - article
      operationId: getArticleVersions
      responses:
        200:
          description: The versions of Article
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Paginated'
                  - type: object
                    properties:
                      result:
                        type: array
                        items:
                          $ref: '#/components/schemas/ArticleResponse'

  /constitutions:
    get:
      summary: Get all constitutions
      tags:
        - constitution
      operationId: getConstitutions
      parameters:
        - $ref: '#/components/parameters/page'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/sort'
        - $ref: '#/components/parameters/direction'
        - $ref: '#/components/parameters/search'
      responses:
        200:
          description: The Constitution objects
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Paginated'
                  - type: object
                    properties:
                      result:
                        type: array
                        items:
                          $ref: '#/components/schemas/ConstitutionResponse'
    post:
      security:
        - JWTAuth: []
      summary: Create new Constitution
      tags:
        - constitution
      operationId: insertConstitution
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConstitutionRequest'
      responses:
        201:
          description: Constitution created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConstitutionResponse'
        401:
          $ref: '#/components/responses/401'
  /constitutions/{constitution}:
    parameters:
      - $ref: '#/components/parameters/constitution'
    get:
      summary: Get all constitutions
      tags:
        - constitution
      operationId: getConstitutions
      responses:
        200:
          description: The Constitution objects
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConstitutionResponse'

  /comments/{comment}:
    parameters:
      - $ref: '#/components/parameters/comment'
    get:
      summary: Get Comment by Comment ID
      tags:
        - comment
      responses:
        200:
          description: Return Comment and children
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommentResponse'
    put:
      security:
        - JWTAuth: []
      summary: Edit existing comment
      tags:
        - comment
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CommentRequest'
      responses:
        200:
          description: Return Comment and children
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommentResponse'
        401:
          $ref: '#/components/responses/401'
  /comments/{comment}/children:
    parameters:
      - $ref: '#/components/parameters/comment'
    get:
      summary: Get Comment children by Comment ID
      tags:
        - comment
      responses:
        200:
          description: Return Comment children
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Paginated'
                  - type: object
                    properties:
                      result:
                        type: array
                        items:
                          $ref: '#/components/schemas/CommentResponse'
    post:
      security:
        - JWTAuth: []
      summary: Create Comment on other comment
      tags:
        - comment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CommentRequest'
      responses:
        201:
          description: Return the created Comment
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    properties:
                      result:
                        type: array
                        items:
                          $ref: '#/components/schemas/CommentResponse'
        404:
          description: Comment not found
        401:
          $ref: '#/components/responses/401'

  /articles/{article}/comments:
    parameters:
      - $ref: '#/components/parameters/article'
    get:
      summary: Get comments of one article
      tags:
        - comment
        - article
      parameters:
        - $ref: '#/components/parameters/page'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/search'
        - name: sort
          in: query
          required: false
          example:
            - created_at
            - votes
          schema:
            type: string
            default: created_at
            enum:
              - created_at
              - votes
      responses:
        200:
          description: Return Comment and children
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommentResponse'
    post:
      security:
        - JWTAuth: []
      summary: Create Comment to article
      tags:
        - comment
        - article
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CommentRequest'
      responses:
        200:
          description: Return Comment and children
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommentResponse'
        401:
          $ref: '#/components/responses/401'
  /constitutions/{constitution}/comments:
    parameters:
      - $ref: '#/components/parameters/constitution'
    get:
      summary: Get comment and children of one constitution
      tags:
        - comment
        - constitution
      responses:
        200:
          description: Return Comment and children
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommentResponse'
    post:
      security:
        - JWTAuth: []
      summary: Create Comment to constitution
      tags:
        - comment
        - constitution
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CommentRequest'
      responses:
        200:
          description: Return Comment and children
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommentResponse'
        401:
          $ref: '#/components/responses/401'

  /articles/{article}/follows:
    parameters:
      - $ref: '#/components/parameters/article'
    get:
      security:
        - JWTAuth: []
      summary: Return Follow or nothing if you not follow
      tags:
        - follow
        - article
      responses:
        200:
          description: Return your follow
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FollowResponse'
        404:
          description: You not follow this article
    post:
      security:
        - JWTAuth: []
      summary: Follow one article
      tags:
        - follow
        - article
      responses:
        201:
          description: Return only http status 201 on success
    delete:
      security:
        - JWTAuth: []
      summary: Unfollow one article
      tags:
        - follow
        - article
      responses:
        204:
          description: Return only http status 204 on success
        401:
          $ref: '#/components/responses/401'
  /constitutions/{constitution}/follows:
    parameters:
      - $ref: '#/components/parameters/constitution'
    post:
      security:
        - JWTAuth: []
      summary: Follow one constitution
      tags:
        - follow
        - constitution
      responses:
        201:
          description: Return only http status 201 on success
        401:
          $ref: '#/components/responses/401'
    delete:
      security:
        - JWTAuth: []
      summary: Unfollow one constitution
      tags:
        - follow
        - constitution
      responses:
        204:
          description: Return only http status 204 on success
        401:
          $ref: '#/components/responses/401'

  /articles/{article}/vote:
    parameters:
      - $ref: '#/components/parameters/article'
    put:
      security:
        - JWTAuth: []
      summary: Vote for one article
      tags:
        - vote
        - article
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VoteRequest'
      responses:
        201:
          description: Return only http status 201 on success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VoteAggregation'
        401:
          $ref: '#/components/responses/401'
  /constitutions/{constitution}/vote:
    parameters:
      - $ref: '#/components/parameters/constitution'
    put:
      security:
        - JWTAuth: []
      summary: Vote for one constitution
      tags:
        - vote
        - constitution
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VoteRequest'
      responses:
        201:
          description: Return only http status 201 on success
  /comments/{comment}/vote:
    parameters:
      - $ref: '#/components/parameters/comment'
    put:
      security:
        - JWTAuth: []
      summary: Vote for a comment
      tags:
        - vote
        - comment
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VoteRequest'
      responses:
        201:
          description: Return votes aggregation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VoteAggregation'
        401:
          $ref: '#/components/responses/401'

  /articles/{article}/opinions:
    parameters:
      - $ref: '#/components/parameters/article'
    put:
      security:
        - JWTAuth: []
      summary: Add Opinion on one article
      tags:
        - opinion
        - article
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ArticleOpinionRequest'
      responses:
        201:
          description: Return the opinion
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Opinion'
        401:
          $ref: '#/components/responses/401'
  /opinions:
    get:
      summary: Get all opinions choices
      tags:
        - opinion
      parameters:
        - in: query
          required: false
          name: targets
          description: opinion available for defined target
          example:
            - article
          schema:
            type: array
            items:
              type: string
      responses:
        200:
          description: return
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OpinionChoices'
  /opinions/{opinion}:
    parameters:
      - $ref: '#/components/parameters/opinion'
    get:
      summary: Get one opinion Choices
      tags:
        - opinion
      responses:
        200:
          description: return
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OpinionChoice'
  /citizens/{citizen}/opinions:
    parameters:
      - $ref: '#/components/parameters/citizen'
    get:
      security:
        - JWTAuth: []
      summary: Get all opinions of citizen filtered by target ids
      tags:
        - opinion
        - citizen
      parameters:
        - in: query
          required: true
          name: id
          description: target ids
          example:
            - 9226c1a3-8091-c3fa-7d0d-c2e98c9bee7b
          schema:
            type: array
            items:
              type: string
              format: uuid
      responses:
        200:
          description: Opinions
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Opinion'
  /citizens/{citizen}/opinions/articles:
    parameters:
      - $ref: '#/components/parameters/citizen'
    get:
      security:
        - JWTAuth: []
      summary: Get all opinions of one citizen
      tags:
        - opinion
        - citizen
      responses:
        200:
          description: Opinions
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Paginated'
                  - type: object
                    properties:
                      result:
                        type: array
                        items:
                          $ref: '#/components/schemas/Opinion'


  /citizens/{citizen}/votes/articles:
    parameters:
      - $ref: '#/components/parameters/citizen'
    get:
      security:
        - JWTAuth: []
      summary: all article vote for one citizen
      tags:
        - vote
        - article
        - citizen
      responses:
        200:
          description: Votes
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Paginated'
                  - type: object
                    properties:
                      result:
                        type: array
                        items:
                          $ref: '#/components/schemas/VoteResponse'
        401:
          $ref: '#/components/responses/401'
  /citizens/{citizen}/comments/articles:
    parameters:
      - $ref: '#/components/parameters/citizen'
    get:
      security:
        - JWTAuth: []
      summary: all article comments for one citizen
      tags:
        - comment
        - article
        - citizen
      responses:
        200:
          description: Comments
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Paginated'
                  - type: object
                    properties:
                      result:
                        type: array
                        items:
                          $ref: '#/components/schemas/CommentResponse'
        401:
          $ref: '#/components/responses/401'

  /workgroups:
    get:
      security:
        - {}
        - JWTAuth: []
      tags:
        - workgroup
      responses:
        200:
          description: paginated list of workgroup
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Paginated'
                  - type: object
                    properties:
                      result:
                        type: array
                        items:
                          $ref: '#/components/schemas/WorkgroupSimple'
    post:
      security:
        - JWTAuth: []
      tags:
        - workgroup
      requestBody:
        content:
          application/json:
            schema:
              properties:
                id:
                  type: string
                  format: uuid
                  nullable: true
                name:
                  type: string
                  example: Les partisants du RIC
                  required: true
                description:
                  type: string
                  example: Group formé pour la conception d'un RIC
                logo:
                  type: string
                  nullable: true
                anonymous:
                  type: boolean
                  example: false
                  nullable: true
                  default: true
                owner:
                  type: string
                  format: uuid
                  example: 6434f4f9-f570-f22a-c134-8668350651ff
                  nullable: true
      responses:
        201:
          description: Workgroup created
          content:
            application/json:
              schema:
                properties:
                  id:
                    type: string
                    format: uuid
                  name:
                    type: string
                    example: Les partisants du RIC
                  description:
                    type: string
                    example: Group formé pour la conception d'un RIC
                  logo:
                    type: string
                  anonymous:
                    type: boolean
                    example: false
                  owner:
                    type: string
                    format: uuid
  /workgroups/{workgroup}:
    parameters:
      - $ref: '#/components/parameters/workgroup'
    get:
      security:
        - {}
        - JWTAuth: []
      tags:
        - workgroup
      responses:
        200:
          description: Workgroup
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Workgroup'
    put:
      security:
        - JWTAuth: []
      tags:
        - workgroup
      requestBody:
        content:
          application/json:
            schema:
              properties:
                name:
                  type: string
                  example: Les partisants du RIC
                  required: true
                description:
                  type: string
                  example: Group formé pour la conception d'un RIC
                logo:
                  type: string
                  nullable: true
                anonymous:
                  type: boolean
                  example: false
                  nullable: true
                  default: true
                owner:
                  type: string
                  format: uuid
                  example: 6434f4f9-f570-f22a-c134-8668350651ff
                  nullable: true
      responses:
        200:
          description: Workgroup updated
          content:
            application/json:
              schema:
                properties:
                  id:
                    type: string
                    format: uuid
                  name:
                    type: string
                    example: Les partisants du RIC
                  description:
                    type: string
                    example: Group formé pour la conception d'un RIC
                  logo:
                    type: string
                  anonymous:
                    type: boolean
                    example: false
                  owner:
                    type: string
                    format: uuid
    delete:
      security:
        - JWTAuth: []
      tags:
        - workgroup
      responses:
        204:
          description: Workgroup deleted
  /workgroups/{workgroup}/members:
    parameters:
      - $ref: '#/components/parameters/workgroup'
    post:
      security:
        - JWTAuth: []
      tags:
        - workgroup
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                    format: uuid
                    example: 6434f4f9-f570-f22a-c134-8668350651ff
      responses:
        201:
          description: the list of members
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/CitizenResponse'
    put:
      security:
        - JWTAuth: []
      tags:
        - workgroup
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                    format: uuid
                    example: 6434f4f9-f570-f22a-c134-8668350651ff
      responses:
        201:
          description: the list of members
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/CitizenResponse'
    delete:
      security:
        - JWTAuth: []
      tags:
        - workgroup
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                    format: uuid
                    example: 6434f4f9-f570-f22a-c134-8668350651ff
      responses:
        200:
          description: the list of members
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/CitizenResponse'

components:
  responses:
    401:
      description: Unautorized
      content:
        application/json:
          schema:
            description: noting
  parameters:
    page:
      name: page
      in: query
      description: The current page
      example: 1
      required: false
      schema:
        default: 1
        type: integer
        minimum: 1
    limit:
      name: limit
      in: query
      description: The number of object per page
      example: 50
      required: false
      schema:
        default: 50
        type: integer
        minimum: 1
        maximum: 50
    sort:
      name: sort
      in: query
      description: The sort field name
      example: first_name
      required: false
      schema:
        type: string
    articleSort:
      name: sort
      in: query
      description: The sort field name
      example: createdAt
      required: false
      schema:
        type: string
        enum:
          - title
          - createdAt
          - vote
          - popularity
    direction:
      name: direction
      in: query
      description: The sort direction
      example: asc
      required: false
      schema:
        type: string
        default: asc
        enum: [asc, desc]
    search:
      name: search
      in: query
      description: A text to seach
      example: content50
      required: false
      schema:
        type: string
    createdBy:
      name: createdBy
      in: query
      description: filter by Author
      example: 4d673bfa-eaef-4290-b52f-85a9c8a7eba5
      required: false
      schema:
        type: string
        format: uuid

    citizen:
      name: citizen
      in: path
      description: ID of citizen
      example: 6434f4f9-f570-f22a-c134-8668350651ff
      required: true
      schema:
        type: string
        format: uuid

    article:
      name: article
      in: path
      required: true
      description: the ID of article
      example: d91aa0cd-61d6-83cc-41bb-8d5656e130f7
      schema:
        type: string
        format: uuid
    opinion:
      in: path
      required: true
      name: opinion
      description: Opinion ID
      example: 6e978eb5-3c48-0def-b093-e01f43983adb
      schema:
        type: string
        format: uuid

    constitution:
      name: constitution
      in: path
      required: true
      description: the ID of constitution
      example: e74be8e4-6823-47c4-bd1b-789725b2fa8e
      schema:
        type: string
        format: uuid

    comment:
      name: comment
      in: path
      description: The ID of comment
      example: 701dc504-db49-7e3a-2c0a-32542507ea57
      required: true
      schema:
        type: string
        format: uuid

    workgroup:
      name: workgroup
      in: path
      description: ID of workgroup
      example: 82a0e60a-bb55-dbc0-1c3d-0a804df2b5df
      required: true
      schema:
        type: string
        format: uuid

  securitySchemes:
    JWTAuth:
      type: http
      scheme: bearer
      description: call /login to get token
      bearerFormat: JWT

  schemas:
    UUID:
      type: string
      pattern: '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'
      description: UUID
      format: uuid
      example:
        e74be8e4-6823-47c4-bd1b-789725b2fa8e

    UuidEntity:
      properties:
        id:
          $ref: '#/components/schemas/UUID'

    CreatedBy:
      properties:
        created_by:
          $ref: '#/components/schemas/CitizenResponse'

    CreatedAt:
      properties:
        created_at:
          type: string
          format: 'date-time'
    UpdatedAt:
      properties:
        updated_at:
          type: string
          format: 'date-time'
    DeletedAt:
      properties:
        deleted_at:
          type: string
          format: 'date-time'
        deleted:
          type: boolean

    versionId:
      properties:
        version_id:
          $ref: '#/components/schemas/UUID'

    lastVersion:
      properties:
        last_version:
          type: boolean
          required: false
          default: false

    Paginated:
      properties:
        result:
          type: array
          items:
            $ref: '#/components/schemas/UuidEntity'
        count:
          type: integer
          minimum: 0
          example: 1
        currentPage:
          type: integer
          minimum: 0
          example: 1
        limit:
          type: integer
          minimum: 0
          example: 50
        offset:
          type: integer
          minimum: 0
          example: 1
        total:
          type: integer
          minimum: 0
          example: 1

    UserBase:
      properties:
        username:
          type: string
          required: true
          example:
            john-doe
    UserResponse:
      allOf:
        - $ref: '#/components/schemas/UserBase'
        - $ref: '#/components/schemas/UuidEntity'
    UserRequest:
      allOf:
        - $ref: '#/components/schemas/UserBase'
        - type: object
          properties:
            plain_password:
              type: string
              required: true
              example:
                azerty
              format: password

    CitizenResponse:
      allOf:
        - $ref: '#/components/schemas/CitizenBase'
        - $ref: '#/components/schemas/CreatedAt'
        - $ref: '#/components/schemas/UuidEntity'
        - type: object
          properties:
            user:
              $ref: '#/components/schemas/UserResponse'
    CitizenBase:
      type: object
      properties:
        name:
          type: object
          properties:
            first_name:
              type: string
              required: true
              example:
                john
            last_name:
              type: string
              required: true
              example:
                Doe
        birthday:
          type: string
          example:
            1984-12-25
        email:
          type: string
          format: email
          example:
            my.email@dc-project.fr
    CitizenRequest:
      allOf:
        - $ref: '#/components/schemas/CitizenBase'
        - type: object
          properties:
            user:
              $ref: '#/components/schemas/UserRequest'

    RegisterRequest:
      $ref: '#/components/schemas/CitizenRequest'

    LoginRequest:
      properties:
        name:
          type: string
          description: username
          required: true
          example:
            john-doe
        password:
          type: string
          description: Pasword
          required: true
          example:
            azerty

    ArticleBase:
      type: object
      allOf:
        - type: object
          properties:
            title:
              type: string
              required: true
              example:
                Limit power of press
            content:
              type: string
              required: true
              example:
                Lorem upsum...
            description:
              type: string
              required: true
              example:
                I think is the bether choice
            tags:
              type: array
              items:
                type: string
              required: false
              default: []
              example: [power, press]
            annonymous:
              type: boolean
              required: false
              default: true
            draft:
              type: boolean
              required: false
              default: false
        - $ref: '#/components/schemas/versionId'
    ArticleResponse:
      type: object
      allOf:
        - $ref: '#/components/schemas/ArticleBase'
        - $ref: '#/components/schemas/UuidEntity'
        - $ref: '#/components/schemas/CreatedBy'
        - $ref: '#/components/schemas/CreatedAt'
        - $ref: '#/components/schemas/lastVersion'
        - $ref: '#/components/schemas/Votable'
        - $ref: '#/components/schemas/Opinionable'

    ArticleRequest:
      $ref: '#/components/schemas/ArticleBase'

    ConstitutionBase:
      type: object
      allOf:
        - type: object
          properties:
            title:
              type: string
              required: true
              example:
                Constitution for the liberty
            titles:
              type: array
              required: false
              default: []
              items:
                $ref: '#/components/schemas/TitleBase'
            annonymous:
              type: boolean
              required: false
              default: true
            draft:
              type: boolean
              required: false
              default: false
        - $ref: '#/components/schemas/versionId'
    ConstitutionResponse:
      type: object
      allOf:
        - $ref: '#/components/schemas/ConstitutionBase'
        - $ref: '#/components/schemas/UuidEntity'
        - $ref: '#/components/schemas/CreatedBy'
        - $ref: '#/components/schemas/CreatedAt'
        - type: object
          properties:
            titles:
              type: array
              items:
                $ref: '#/components/schemas/TitleResponse'
    ConstitutionRequest:
      allOf:
        - $ref: '#/components/schemas/ConstitutionBase'
        - type: object
          properties:
            titles:
              type: array
              items:
                $ref: '#/components/schemas/TitleRequest'

    TitleBase:
      type: object
      properties:
        name:
          type: string
          required: true
          example:
            The liberties
        rank:
          type: integer
          minimum: 0
          example:
            0
    TitleRequest:
      type: object
      allOf:
        - $ref: '#/components/schemas/TitleBase'
        - $ref: '#/components/schemas/UuidEntity'
        - type: object
          properties:
            articles:
              type: array
              items:
                $ref: '#/components/schemas/UuidEntity'
    TitleResponse:
      type: object
      allOf:
        - $ref: '#/components/schemas/TitleBase'
        - $ref: '#/components/schemas/UuidEntity'
        - $ref: '#/components/schemas/CreatedAt'
        - $ref: '#/components/schemas/CreatedBy'
        - type: object
          properties:
            articles:
              type: array
              items:
                $ref: '#/components/schemas/ArticleResponse'

    Extra:
      type: object
      allOf:
        - $ref: '#/components/schemas/UuidEntity'
        - $ref: '#/components/schemas/CreatedAt'
        - $ref: '#/components/schemas/CreatedBy'
        - type: object
          properties:
            target:
              $ref: '#/components/schemas/UuidEntity'

    CommentBase:
      type: object
      allOf:
        - type: object
          properties:
            content:
              type: string
              required: true
              example:
                Lorem ipsum...
    CommentRequest:
      allOf:
        - $ref: '#/components/schemas/CommentBase'

    CommentResponse:
      allOf:
        - $ref: '#/components/schemas/CommentBase'
        - $ref: '#/components/schemas/UpdatedAt'
        - $ref: '#/components/schemas/Extra'
        - $ref: '#/components/schemas/Votable'
        - type: object
          properties:
            parents_ids:
              type: array
              required: false
              items:
                $ref: '#/components/schemas/UUID'
            parent:
              required: false
              allOf:
                - $ref: '#/components/schemas/UUID'

    FollowBase:
      allOf:
        - $ref: '#/components/schemas/Extra'
    FollowResponse:
      allOf:
        - $ref: '#/components/schemas/FollowBase'


    VoteBase:
      allOf:
        - type: object
          properties:
            note:
              type: integer
              minimum: -1
              maximum: 1
              required: true
    VoteRequest:
      allOf:
        - $ref: '#/components/schemas/VoteBase'
    VoteResponse:
      allOf:
        - $ref: '#/components/schemas/VoteBase'
        - $ref: '#/components/schemas/Extra'
    VoteAggregation:
      allOf:
        - type: object
          properties:
            up:
              type: number
              minimum: 0
            neutral:
              type: number
              minimum: 0
            down:
              type: number
              minimum: 0
            total:
              type: number
              minimum: 0
            score:
              type: number
        - $ref: '#/components/schemas/UpdatedAt'
    Votable:
      type: object
      properties:
        votes:
          $ref: '#/components/schemas/VoteAggregation'
    Opinionable:
      type: object
      properties:
        opinions:
          type: string
          additionalProperties: true
          example:
            Opinion1: 1
            Opinion2: 55

    ArticleOpinionRequest:
      type: object
      properties:
        ids:
          type: array
          items:
            type: string
            format: uuid
            example: 6e978eb5-3c48-0def-b093-e01f43983adb

    OpinionChoices:
      description: Opinion Choice
      type: array
      items:
        $ref: '#/components/schemas/OpinionChoice'

    OpinionChoice:
      description: Opinion Choice
      allOf:
        - type: object
          properties:
            id:
              type: string
              format: uuid
            name:
              type: string
              example: opinion1
            target:
              type: array
              required: false
              nullable: true
              items:
                type: string
                description: the name of the target
        - $ref: '#/components/schemas/CreatedAt'
        - $ref: '#/components/schemas/DeletedAt'

    Opinion:
      description: Opinion
      allOf:
        - type: object
          properties:
            id:
              type: string
              format: uuid
            name:
              type: string
              example: opinion1
            target:
              type: object
              properties:
                  id:
                    type: string
                    format: uuid
                  reference:
                    type: string
                    example: article
            choice:
              type: object
              allOf:
                - $ref: '#/components/schemas/OpinionChoice'
            reference:
              type: string
              example: opinion_on_article
        - $ref: '#/components/schemas/CreatedBy'
        - $ref: '#/components/schemas/CreatedAt'

    WorkgroupSimple:
      description: Workgroup
      allOf:
        - type: object
          properties:
            id:
              type: string
              format: uuid
            name:
              type: string
              example: Les partisants du RIC
            description:
              type: string
              example: Group formé pour la conception d'un RIC
            logo:
              type: string
            anonymous:
              type: boolean
              example: false
            owner:
              $ref: '#/components/schemas/CitizenResponse'
        - $ref: '#/components/schemas/CreatedBy'
        - $ref: '#/components/schemas/DeletedAt'
    Workgroup:
      description: Workgroup
      allOf:
        - $ref: '#/components/schemas/WorkgroupSimple'
        - type: object
          properties:
            members:
              type: array
              items:
                $ref: '#/components/schemas/CitizenResponse'
        - $ref: '#/components/schemas/CreatedAt'
        - $ref: '#/components/schemas/UpdatedAt'



  requestBodies:
    RegisterRequest:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/RegisterRequest'
      description: Register
      required: true

    LoginRequest:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/LoginRequest'
      description: Login
      required: true

servers:
  - description: localhost
    url: http://localhost:8080
  - description: production
    url: http://dc-project.fr