---
openapi: 3.0.0
info:
  title: CaG Events API
  description: API specification for CaG Events back-end.
  version: 1.0.0-SNAPSHOT
  license:
    name: GPLv3
    url: https://www.gnu.org/licenses/gpl-3.0.en.html
  contact:
    url: https://github.com/CasualGaming/cag-events
    email: dev@casualgaming.no

paths:
  "/users":
    get:
      summary: Get all users
      description: >-
        Includes only user fields the current user has permission to view.
      tags:
        - user
      parameters:
        - in: query
          name: limit
          description: Max amount of results to return
          required: false
          schema:
            type: integer
            format: int64
        - in: query
          name: offset
          description: Which result to start returning at (related to limit)
          required: false
          schema:
            type: integer
            format: int64
        - in: query
          name: fields
          description: Which user fields to include
          required: false
          schema:
            type: string
        - in: query
          name: partial_username
          description: Partial, case-insensitive username
          required: false
          schema:
            type: string
        - in: query
          name: member
          description: If the user is or is not currently a member
          required: false
          schema:
            type: boolean
        - in: query
          name: groups
          description: Which groups the user is member of
          required: false
          schema:
            type: string
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                  previous:
                    type: string
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/User"
  "/users/{username}":
    parameters:
      - in: path
        name: username
        description: Username
        required: true
        schema:
          type: string
    get:
      summary: Get a user
      description: Includes only fields the current user has permission to view.
      tags:
        - user
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                $ref: "#/components/schemas/User"
  "/users/{username}/teams":
    parameters:
      - in: path
        name: username
        description: Username
        required: true
        schema:
          type: string
    get:
      summary: Get all teams for a user
      tags:
        - user
        - team
      parameters:
        - in: query
          name: limit
          description: Max amount of results to return
          required: false
          schema:
            type: integer
            format: int64
        - in: query
          name: offset
          description: Which result to start returning at (related to limit)
          required: false
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                  previous:
                    type: string
                  results:
                    type: array
                    items:
                      type: integer
                      format: int64
  "/users/{username}/tickets":
    parameters:
      - in: path
        name: username
        description: Username
        required: true
        schema:
          type: string
    get:
      summary: Get all tickets for a user
      tags:
        - user
        - ticket
      parameters:
        - in: query
          name: limit
          description: Max amount of results to return
          required: false
          schema:
            type: integer
            format: int64
        - in: query
          name: offset
          description: Which result to start returning at (related to limit)
          required: false
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                  previous:
                    type: string
                  results:
                    type: array
                    items:
                      type: integer
                      format: int64
  "/events":
    get:
      summary: Get all events
      tags:
        - event
      parameters:
        - in: query
          name: time_status
          description: If upcoming, active and/or over events should be included
          required: false
          schema:
            type: string
        - in: query
          name: limit
          description: Max amount of results to return
          required: false
          schema:
            type: integer
            format: int64
        - in: query
          name: offset
          description: Which result to start returning at (related to limit)
          required: false
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                  previous:
                    type: string
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/Event"
    post:
      summary: Create an event
      tags:
        - event
      requestBody:
        content:
          "application/json":
            schema:
              $ref: "#/components/schemas/Event"
        required: true
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: integer
                format: int64
  "/events/{id}":
    parameters:
      - in: path
        name: id
        description: Event ID
        required: true
        schema:
          type: integer
          format: int64
    get:
      summary: Get an event
      tags:
        - event
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                $ref: "#/components/schemas/Event"
    patch:
      summary: Update an event
      tags:
        - event
      requestBody:
        content:
          "application/json":
            schema:
              $ref: "#/components/schemas/Event"
        required: true
      responses:
        "200":
          description: Success
    delete:
      summary: Delete an event
      tags:
        - event
      responses:
        "200":
          description: Success
  "/events/{id}/participants":
    parameters:
      - in: path
        name: id
        description: Event ID
        required: true
        schema:
          type: integer
          format: int64
    get:
      summary: Get all participating users for an event
      tags:
        - event
        - user
      parameters:
        - in: query
          name: limit
          description: Max amount of results to return
          required: false
          schema:
            type: integer
            format: int64
        - in: query
          name: offset
          description: Which result to start returning at (related to limit)
          required: false
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                  previous:
                    type: string
                  results:
                    type: array
                    items:
                      type: integer
                      format: int64
  "/events/{id}/competitions":
    parameters:
      - in: path
        name: id
        description: Event ID
        required: true
        schema:
          type: integer
          format: int64
    get:
      summary: Get all competitions for an event
      tags:
        - event
        - competition
      parameters:
        - in: query
          name: limit
          description: Max amount of results to return
          required: false
          schema:
            type: integer
            format: int64
        - in: query
          name: offset
          description: Which result to start returning at (related to limit)
          required: false
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                  previous:
                    type: string
                  results:
                    type: array
                    items:
                      type: integer
                      format: int64
  "/events/{id}/articles":
    parameters:
      - in: path
        name: id
        description: Event ID
        required: true
        schema:
          type: integer
          format: int64
    get:
      summary: Get all articles for an event
      tags:
        - event
        - article
      parameters:
        - in: query
          name: limit
          description: Max amount of results to return
          required: false
          schema:
            type: integer
            format: int64
        - in: query
          name: offset
          description: Which result to start returning at (related to limit)
          required: false
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                  previous:
                    type: string
                  results:
                    type: array
                    items:
                      type: integer
                      format: int64
  "/events/{id}/products":
    parameters:
      - in: path
        name: id
        description: Event ID
        required: true
        schema:
          type: integer
          format: int64
    get:
      summary: Get all products for an event
      tags:
        - event
        - store
      parameters:
        - in: query
          name: limit
          description: Max amount of results to return
          required: false
          schema:
            type: integer
            format: int64
        - in: query
          name: offset
          description: Which result to start returning at (related to limit)
          required: false
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                  previous:
                    type: string
                  results:
                    type: array
                    items:
                      type: integer
                      format: int64
  "/events/{id}/sponsors":
    parameters:
      - in: path
        name: id
        description: Event ID
        required: true
        schema:
          type: integer
          format: int64
    get:
      summary: Get all sponsors for an event
      tags:
        - event
        - sponsor
      parameters:
        - in: query
          name: limit
          description: Max amount of results to return
          required: false
          schema:
            type: integer
            format: int64
        - in: query
          name: offset
          description: Which result to start returning at (related to limit)
          required: false
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                  previous:
                    type: string
                  results:
                    type: array
                    items:
                      type: integer
                      format: int64
  "/articles":
    get:
      summary: Get all articles
      tags:
        - article
      parameters:
        - in: query
          name: limit
          description: Max amount of results to return
          required: false
          schema:
            type: integer
            format: int64
        - in: query
          name: offset
          description: Which result to start returning at (related to limit)
          required: false
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                  previous:
                    type: string
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/Article"
    post:
      summary: Create an article
      tags:
        - article
      requestBody:
        content:
          "application/json":
            schema:
              $ref: "#/components/schemas/Article"
        required: true
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: integer
                format: int64
  "/articles/{id}":
    parameters:
      - in: path
        name: id
        description: Article ID
        required: true
        schema:
          type: integer
          format: int64
    get:
      summary: Get an article
      tags:
        - article
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                $ref: "#/components/schemas/Article"
    patch:
      summary: Update an article
      tags:
        - article
      requestBody:
        content:
          "application/json":
            schema:
              $ref: "#/components/schemas/Article"
        required: true
      responses:
        "200":
          description: Success
    delete:
      summary: Delete an article
      tags:
        - article
      responses:
        "200":
          description: Success
  "/sponsors":
    get:
      summary: Get all sponsors
      tags:
        - sponsor
      parameters:
        - in: query
          name: limit
          description: Max amount of results to return
          required: false
          schema:
            type: integer
            format: int64
        - in: query
          name: offset
          description: Which result to start returning at (related to limit)
          required: false
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                  previous:
                    type: string
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/Sponsor"
    post:
      summary: Create a sponsor
      tags:
        - sponsor
      requestBody:
        content:
          "application/json":
            schema:
              $ref: "#/components/schemas/Sponsor"
        required: true
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: integer
                format: int64
  "/sponsors/{id}":
    parameters:
      - in: path
        name: id
        description: Sponsor ID
        required: true
        schema:
          type: integer
          format: int64
    get:
      summary: Get a sponsor
      tags:
        - sponsor
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                $ref: "#/components/schemas/Sponsor"
    patch:
      summary: Update a sponsor
      tags:
        - sponsor
      requestBody:
        content:
          "application/json":
            schema:
              $ref: "#/components/schemas/Sponsor"
        required: true
      responses:
        "200":
          description: Success
    delete:
      summary: Delete a sponsor
      tags:
        - sponsor
      responses:
        "200":
          description: Success
  "/teams":
    get:
      summary: Get all teams
      tags:
        - team
      parameters:
        - in: query
          name: limit
          description: Max amount of results to return
          required: false
          schema:
            type: integer
            format: int64
        - in: query
          name: offset
          description: Which result to start returning at (related to limit)
          required: false
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                  previous:
                    type: string
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/Team"
    post:
      summary: Create a team
      tags:
        - team
      requestBody:
        content:
          "application/json":
            schema:
              $ref: "#/components/schemas/Team"
        required: true
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: integer
                format: int64
  "/teams/{id}":
    parameters:
      - in: path
        name: id
        description: Team ID
        required: true
        schema:
          type: integer
          format: int64
    get:
      summary: Get a team
      tags:
        - team
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                $ref: "#/components/schemas/Team"
    patch:
      summary: Update a team
      tags:
        - team
      requestBody:
        content:
          "application/json":
            schema:
              $ref: "#/components/schemas/Team"
        required: true
      responses:
        "200":
          description: Success
    delete:
      summary: Delete a team
      tags:
        - team
      responses:
        "200":
          description: Success
  "/competitions":
    get:
      summary: Get all competitions
      tags:
        - competition
      parameters:
        - in: query
          name: limit
          description: Max amount of results to return
          required: false
          schema:
            type: integer
            format: int64
        - in: query
          name: offset
          description: Which result to start returning at (related to limit)
          required: false
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                  previous:
                    type: string
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/Competition"
    post:
      summary: Create a competition
      tags:
        - competition
      requestBody:
        content:
          "application/json":
            schema:
              $ref: "#/components/schemas/Competition"
        required: true
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: integer
                format: int64
  "/competitions/{id}":
    parameters:
      - in: path
        name: id
        description: Competition ID
        required: true
        schema:
          type: integer
          format: int64
    get:
      summary: Get a competition
      tags:
        - competition
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                $ref: "#/components/schemas/Competition"
    patch:
      summary: Update a competition
      tags:
        - competition
      requestBody:
        content:
          "application/json":
            schema:
              $ref: "#/components/schemas/Competition"
        required: true
      responses:
        "200":
          description: Success
    delete:
      summary: Delete a competition
      tags:
        - competition
      responses:
        "200":
          description: Success
  "/ticket_types":
    get:
      summary: Get all ticket types
      tags:
        - ticket
      parameters:
        - in: query
          name: limit
          description: Max amount of results to return
          required: false
          schema:
            type: integer
            format: int64
        - in: query
          name: offset
          description: Which result to start returning at (related to limit)
          required: false
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                  previous:
                    type: string
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/TicketType"
    post:
      summary: Create a ticket type
      tags:
        - ticket
      requestBody:
        content:
          "application/json":
            schema:
              $ref: "#/components/schemas/TicketType"
        required: true
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: integer
                format: int64
  "/ticket_types/{id}":
    parameters:
      - in: path
        name: id
        description: Ticket type ID
        required: true
        schema:
          type: integer
          format: int64
    get:
      summary: Get a ticket type
      tags:
        - ticket
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                $ref: "#/components/schemas/TicketType"
    patch:
      summary: Update a ticket type
      tags:
        - ticket
      requestBody:
        content:
          "application/json":
            schema:
              $ref: "#/components/schemas/TicketType"
        required: true
      responses:
        "200":
          description: Success
    delete:
      summary: Delete a ticket type
      tags:
        - ticket
      responses:
        "200":
          description: Success
  "/tickets":
    get:
      summary: Get all tickets
      tags:
        - ticket
      parameters:
        - in: query
          name: limit
          description: Max amount of results to return
          required: false
          schema:
            type: integer
            format: int64
        - in: query
          name: offset
          description: Which result to start returning at (related to limit)
          required: false
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                  previous:
                    type: string
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/Ticket"
    post:
      summary: Create a ticket
      tags:
        - ticket
      requestBody:
        content:
          "application/json":
            schema:
              $ref: "#/components/schemas/Ticket"
        required: true
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: integer
                format: int64
  "/tickets/{id}":
    parameters:
      - in: path
        name: id
        description: Ticket ID
        required: true
        schema:
          type: integer
          format: int64
    get:
      summary: Get a ticket
      tags:
        - ticket
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                $ref: "#/components/schemas/Ticket"
    patch:
      summary: Update a ticket
      tags:
        - ticket
      requestBody:
        content:
          "application/json":
            schema:
              $ref: "#/components/schemas/Ticket"
        required: true
      responses:
        "200":
          description: Success
    delete:
      summary: Delete a ticket
      tags:
        - ticket
      responses:
        "200":
          description: Success
  "/tickets/{id}/regen-activation-code":
    parameters:
      - in: path
        name: id
        description: Ticket ID
        required: true
        schema:
          type: integer
          format: int64
    post:
      summary: "Regenerate the activation code for a ticket"
      tags:
        - ticket
      responses:
        "200":
          description: Success
  "/store_products":
    get:
      summary: Get all products
      tags:
        - store
      parameters:
        - in: query
          name: limit
          description: Max amount of results to return
          required: false
          schema:
            type: integer
            format: int64
        - in: query
          name: offset
          description: Which result to start returning at (related to limit)
          required: false
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                  previous:
                    type: string
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/StoreProduct"
    post:
      summary: Create a product
      tags:
        - store
      requestBody:
        content:
          "application/json":
            schema:
              $ref: "#/components/schemas/StoreProduct"
        required: true
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: integer
                format: int64
  "/store_products/{id}":
    parameters:
      - in: path
        name: id
        description: Store product ID
        required: true
        schema:
          type: integer
          format: int64
    get:
      summary: Get a product
      tags:
        - store
      responses:
        "200":
          description: Success
    patch:
      summary: Update a product
      tags:
        - store
      responses:
        "200":
          description: Success
    delete:
      summary: Delete a product
      tags:
        - store
      responses:
        "200":
          description: Success
  "/orders":
    get:
      summary: Get an order
      tags:
        - store
      parameters:
        - in: query
          name: limit
          description: Max amount of results to return
          required: false
          schema:
            type: integer
            format: int64
        - in: query
          name: offset
          description: Which result to start returning at (related to limit)
          required: false
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                  previous:
                    type: string
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/Order"
    post:
      summary: Create an order
      tags:
        - store
      requestBody:
        content:
          "application/json":
            schema:
              $ref: "#/components/schemas/Order"
        required: true
      responses:
        "200":
          description: Success
          content:
            "application/json":
              schema:
                type: integer
                format: int64
    patch:
      summary: Update an order
      tags:
        - store
      requestBody:
        content:
          "application/json":
            schema:
              $ref: "#/components/schemas/Order"
        required: true
      responses:
        "200":
          description: Success

components:
  schemas:
    User:
      type: object
      properties:
        id:
          type: integer
          format: int64
        subject_id:
          type: string
        username:
          type: string
        pretty_username:
          type: string
        first_name:
          type: string
        last_name:
          type: string
        email_address:
          type: string
        birth_date:
          type: string
        street_address:
          type: string
        postal_code:
          type: string
        phone_number:
          type: string
    Event:
      type: object
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
    TicketType:
      type: object
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
    Ticket:
      type: object
      properties:
        id:
          type: integer
          format: int64
        type:
          $ref: "#/components/schemas/TicketType"
    Article:
      type: object
      properties:
        id:
          type: integer
          format: int64
        header:
          type: string
        body:
          type: string
    Sponsor:
      type: object
      properties:
        id:
          type: integer
          format: int64
        data:
          type: string
    Team:
      type: object
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
        members:
          type: array
          items:
            $ref: "#/components/schemas/User"
    Competition:
      type: object
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
        leader:
          $ref: "#/components/schemas/User"
        participants:
          type: array
          items:
            $ref: "#/components/schemas/User"
    StoreProduct:
      type: object
      properties:
        id:
          type: integer
          format: int64
    Order:
      type: object
      properties:
        id:
          type: integer
          format: int64
        is_refunded:
          type: boolean
        refund_reason:
          type: string