basePath: /
definitions:
  dto.CreateApplicationRequest:
    properties:
      documents:
        additionalProperties: true
        type: object
      email:
        type: string
      jobId:
        type: string
      lineId:
        type: string
      message:
        type: string
      name:
        type: string
      phone:
        type: string
      resumeUrl:
        type: string
      userId:
        type: string
      whatsapp:
        type: string
    required:
    - jobId
    type: object
  dto.CreateJobRequest:
    properties:
      benefits:
        additionalProperties: true
        type: object
      cityId:
        type: integer
      companyId:
        type: string
      currency:
        enum:
        - BRL
        - USD
        - EUR
        - GBP
        - JPY
        type: string
      description:
        minLength: 20
        type: string
      employmentType:
        enum:
        - full-time
        - part-time
        - dispatch
        - contract
        - temporary
        - training
        - voluntary
        - permanent
        type: string
      languageLevel:
        type: string
      location:
        type: string
      regionId:
        type: integer
      requirements:
        additionalProperties: true
        type: object
      salaryMax:
        type: number
      salaryMin:
        type: number
      salaryType:
        enum:
        - hourly
        - daily
        - weekly
        - monthly
        - yearly
        type: string
      status:
        enum:
        - draft
        - open
        - closed
        - review
        - published
        - paused
        - expired
        - archived
        - reported
        type: string
      title:
        maxLength: 255
        minLength: 5
        type: string
      visaSupport:
        type: boolean
      workingHours:
        type: string
    required:
    - companyId
    - description
    - title
    type: object
  dto.PaginatedResponse:
    properties:
      data: {}
      pagination:
        $ref: '#/definitions/dto.Pagination'
    type: object
  dto.Pagination:
    properties:
      limit:
        type: integer
      page:
        type: integer
      total:
        type: integer
    type: object
  dto.UpdateApplicationStatusRequest:
    properties:
      notes:
        type: string
      status:
        enum:
        - pending
        - reviewed
        - shortlisted
        - rejected
        - hired
        type: string
    required:
    - status
    type: object
  dto.UpdateJobRequest:
    properties:
      benefits:
        additionalProperties: true
        type: object
      cityId:
        type: integer
      currency:
        enum:
        - BRL
        - USD
        - EUR
        - GBP
        - JPY
        type: string
      description:
        minLength: 20
        type: string
      employmentType:
        enum:
        - full-time
        - part-time
        - dispatch
        - contract
        - temporary
        - training
        - voluntary
        - permanent
        type: string
      languageLevel:
        type: string
      location:
        type: string
      regionId:
        type: integer
      requirements:
        additionalProperties: true
        type: object
      salaryMax:
        type: number
      salaryMin:
        type: number
      salaryType:
        enum:
        - hourly
        - daily
        - weekly
        - monthly
        - yearly
        type: string
      status:
        enum:
        - draft
        - open
        - closed
        - review
        - published
        - paused
        - expired
        - archived
        - reported
        type: string
      title:
        maxLength: 255
        minLength: 5
        type: string
      visaSupport:
        type: boolean
      workingHours:
        type: string
    type: object
  handlers.DownloadURLRequest:
    properties:
      key:
        type: string
    type: object
  handlers.DownloadURLResponse:
    properties:
      downloadUrl:
        type: string
      expiresIn:
        description: seconds
        type: integer
    type: object
  handlers.UploadURLRequest:
    properties:
      contentType:
        type: string
      filename:
        type: string
      folder:
        description: 'Optional: logos, resumes, documents'
        type: string
    type: object
  handlers.UploadURLResponse:
    properties:
      expiresIn:
        description: seconds
        type: integer
      key:
        type: string
      publicUrl:
        type: string
      uploadUrl:
        type: string
    type: object
  models.Application:
    properties:
      createdAt:
        description: Metadata
        type: string
      documents:
        allOf:
        - $ref: '#/definitions/models.JSONMap'
        description: Array of {type, url}
      email:
        type: string
      id:
        type: string
      jobId:
        type: string
      lineId:
        type: string
      message:
        description: Application Content
        type: string
      name:
        description: Applicant Info (for guest applications)
        type: string
      notes:
        type: string
      phone:
        type: string
      resumeUrl:
        type: string
      status:
        description: Status & Notes
        type: string
      updatedAt:
        type: string
      userId:
        description: NULL for guest applications
        type: string
      whatsapp:
        type: string
    type: object
  models.JSONMap:
    additionalProperties: true
    type: object
  models.Job:
    properties:
      benefits:
        $ref: '#/definitions/models.JSONMap'
      cityId:
        type: integer
      companyId:
        type: string
      createdAt:
        description: Metadata
        type: string
      createdBy:
        type: string
      currency:
        description: BRL, USD, EUR, GBP, JPY
        type: string
      description:
        type: string
      employmentType:
        description: Employment
        type: string
      id:
        type: string
      isFeatured:
        description: Featured job flag
        type: boolean
      languageLevel:
        description: N5-N1, beginner, none
        type: string
      location:
        description: Location
        type: string
      regionId:
        type: integer
      requirements:
        allOf:
        - $ref: '#/definitions/models.JSONMap'
        description: Requirements & Benefits (JSONB arrays)
      salaryMax:
        type: number
      salaryMin:
        description: Salary
        type: number
      salaryType:
        description: hourly, daily, weekly, monthly, yearly
        type: string
      status:
        description: Status
        type: string
      title:
        description: Job Details
        type: string
      updatedAt:
        type: string
      visaSupport:
        description: Visa & Language
        type: boolean
      workMode:
        description: onsite, hybrid, remote
        type: string
      workingHours:
        type: string
    type: object
  models.Notification:
    properties:
      createdAt:
        type: string
      id:
        type: string
      link:
        type: string
      message:
        type: string
      readAt:
        type: string
      title:
        type: string
      type:
        description: info, success, warning, error
        type: string
      updatedAt:
        type: string
      userId:
        type: integer
    type: object
  models.Ticket:
    properties:
      createdAt:
        type: string
      id:
        type: string
      priority:
        description: low, medium, high
        type: string
      status:
        description: open, in_progress, closed
        type: string
      subject:
        type: string
      updatedAt:
        type: string
      userId:
        type: integer
    type: object
  models.TicketMessage:
    properties:
      createdAt:
        type: string
      id:
        type: string
      message:
        type: string
      ticketId:
        type: string
      userId:
        type: integer
    type: object
info:
  contact: {}
  description: API for GoHorseJobs recruitment platform.
  title: GoHorseJobs API
  version: "1.0"
paths:
  /api/v1/applications:
    get:
      consumes:
      - application/json
      description: List all applications for a job
      parameters:
      - description: Filter applications by job ID
        in: query
        name: jobId
        required: true
        type: integer
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            items:
              $ref: '#/definitions/models.Application'
            type: array
        "400":
          description: Bad Request
          schema:
            type: string
        "500":
          description: Internal Server Error
          schema:
            type: string
      summary: List Applications
      tags:
      - Applications
    post:
      consumes:
      - application/json
      description: Submit a new job application for a posting
      parameters:
      - description: Application data
        in: body
        name: application
        required: true
        schema:
          $ref: '#/definitions/dto.CreateApplicationRequest'
      produces:
      - application/json
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/models.Application'
        "400":
          description: Bad Request
          schema:
            type: string
        "500":
          description: Internal Server Error
          schema:
            type: string
      summary: Create Application
      tags:
      - Applications
  /api/v1/applications/{id}:
    get:
      consumes:
      - application/json
      description: Retrieve a job application by its ID
      parameters:
      - description: Application ID
        in: path
        name: id
        required: true
        type: integer
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.Application'
        "400":
          description: Bad Request
          schema:
            type: string
        "404":
          description: Not Found
          schema:
            type: string
      summary: Get Application
      tags:
      - Applications
  /api/v1/applications/{id}/status:
    put:
      consumes:
      - application/json
      description: Update the status of a job application
      parameters:
      - description: Application ID
        in: path
        name: id
        required: true
        type: integer
      - description: Status update
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/dto.UpdateApplicationStatusRequest'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.Application'
        "400":
          description: Bad Request
          schema:
            type: string
        "500":
          description: Internal Server Error
          schema:
            type: string
      summary: Update Application Status
      tags:
      - Applications
  /api/v1/auth/login:
    post:
      consumes:
      - application/json
      description: Authenticates a user by email and password. Returns JWT and user
        info.
      parameters:
      - description: Login Credentials
        in: body
        name: login
        required: true
        schema:
          type: object
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            type: object
        "400":
          description: Invalid Request
          schema:
            type: string
        "401":
          description: Unauthorized
          schema:
            type: string
      summary: User Login
      tags:
      - Auth
  /api/v1/companies:
    get:
      consumes:
      - application/json
      description: Returns a list of all companies.
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            items:
              type: object
            type: array
        "500":
          description: Internal Server Error
          schema:
            type: string
      summary: List Companies
      tags:
      - Companies
    post:
      consumes:
      - application/json
      description: Registers a new company and creates an initial admin user.
      parameters:
      - description: Company Details
        in: body
        name: company
        required: true
        schema:
          type: object
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            type: object
        "400":
          description: Invalid Request
          schema:
            type: string
        "500":
          description: Internal Server Error
          schema:
            type: string
      summary: Create Company (Tenant)
      tags:
      - Companies
  /api/v1/jobs:
    get:
      consumes:
      - application/json
      description: Get a paginated list of job postings with optional filters
      parameters:
      - description: 'Page number (default: 1)'
        in: query
        name: page
        type: integer
      - description: 'Items per page (default: 10, max: 100)'
        in: query
        name: limit
        type: integer
      - description: Filter by company ID
        in: query
        name: companyId
        type: integer
      - description: Filter by featured status
        in: query
        name: featured
        type: boolean
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/dto.PaginatedResponse'
        "500":
          description: Internal Server Error
          schema:
            type: string
      summary: List all jobs
      tags:
      - Jobs
    post:
      consumes:
      - application/json
      description: Create a new job posting
      parameters:
      - description: Job data
        in: body
        name: job
        required: true
        schema:
          $ref: '#/definitions/dto.CreateJobRequest'
      produces:
      - application/json
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/models.Job'
        "400":
          description: Bad Request
          schema:
            type: string
        "500":
          description: Internal Server Error
          schema:
            type: string
      summary: Create a new job
      tags:
      - Jobs
  /api/v1/jobs/{id}:
    delete:
      consumes:
      - application/json
      description: Delete a job posting
      parameters:
      - description: Job ID
        in: path
        name: id
        required: true
        type: integer
      produces:
      - application/json
      responses:
        "204":
          description: No Content
        "400":
          description: Bad Request
          schema:
            type: string
        "500":
          description: Internal Server Error
          schema:
            type: string
      summary: Delete a job
      tags:
      - Jobs
    get:
      consumes:
      - application/json
      description: Get a single job posting by its ID
      parameters:
      - description: Job ID
        in: path
        name: id
        required: true
        type: integer
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.Job'
        "400":
          description: Bad Request
          schema:
            type: string
        "404":
          description: Not Found
          schema:
            type: string
      summary: Get job by ID
      tags:
      - Jobs
    put:
      consumes:
      - application/json
      description: Update an existing job posting
      parameters:
      - description: Job ID
        in: path
        name: id
        required: true
        type: integer
      - description: Updated job data
        in: body
        name: job
        required: true
        schema:
          $ref: '#/definitions/dto.UpdateJobRequest'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.Job'
        "400":
          description: Bad Request
          schema:
            type: string
        "500":
          description: Internal Server Error
          schema:
            type: string
      summary: Update a job
      tags:
      - Jobs
  /api/v1/notifications:
    get:
      consumes:
      - application/json
      description: Returns a list of notifications for the current user.
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            items:
              $ref: '#/definitions/models.Notification'
            type: array
        "500":
          description: Internal Server Error
          schema:
            type: string
      security:
      - BearerAuth: []
      summary: List Notifications
      tags:
      - Notifications
  /api/v1/notifications/{id}/read:
    patch:
      consumes:
      - application/json
      description: Marks a notification as read.
      parameters:
      - description: Notification ID
        in: path
        name: id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: Marked as read
          schema:
            type: string
        "500":
          description: Internal Server Error
          schema:
            type: string
      security:
      - BearerAuth: []
      summary: Mark Notification Read
      tags:
      - Notifications
  /api/v1/notifications/read-all:
    patch:
      consumes:
      - application/json
      description: Marks all notifications as read.
      produces:
      - application/json
      responses:
        "200":
          description: All marked as read
          schema:
            type: string
        "500":
          description: Internal Server Error
          schema:
            type: string
      security:
      - BearerAuth: []
      summary: Mark All Notifications Read
      tags:
      - Notifications
  /api/v1/storage/download-url:
    post:
      consumes:
      - application/json
      description: Generate a pre-signed URL to download a private file from S3
      parameters:
      - description: Download request
        in: body
        name: request
        required: true
        schema:
          $ref: '#/definitions/handlers.DownloadURLRequest'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.DownloadURLResponse'
        "400":
          description: Bad Request
          schema:
            type: string
        "500":
          description: Internal Server Error
          schema:
            type: string
      security:
      - BearerAuth: []
      summary: Generate download URL
      tags:
      - Storage
  /api/v1/storage/files:
    delete:
      consumes:
      - application/json
      description: Delete a stored file by key
      parameters:
      - description: File key
        in: query
        name: key
        required: true
        type: string
      produces:
      - application/json
      responses:
        "204":
          description: No Content
        "400":
          description: Bad Request
          schema:
            type: string
        "500":
          description: Internal Server Error
          schema:
            type: string
      security:
      - BearerAuth: []
      summary: Delete file
      tags:
      - Storage
  /api/v1/storage/upload-url:
    post:
      consumes:
      - application/json
      description: Generate a pre-signed URL to upload a file to S3
      parameters:
      - description: Upload request
        in: body
        name: request
        required: true
        schema:
          $ref: '#/definitions/handlers.UploadURLRequest'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.UploadURLResponse'
        "400":
          description: Bad Request
          schema:
            type: string
        "500":
          description: Internal Server Error
          schema:
            type: string
      security:
      - BearerAuth: []
      summary: Generate upload URL
      tags:
      - Storage
  /api/v1/support/tickets:
    get:
      consumes:
      - application/json
      description: Returns a list of tickets for the current user.
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            items:
              $ref: '#/definitions/models.Ticket'
            type: array
        "500":
          description: Internal Server Error
          schema:
            type: string
      security:
      - BearerAuth: []
      summary: List Tickets
      tags:
      - Support
    post:
      consumes:
      - application/json
      description: Creates a new support ticket.
      parameters:
      - description: Ticket Details
        in: body
        name: ticket
        required: true
        schema:
          type: object
      produces:
      - application/json
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/models.Ticket'
        "400":
          description: Invalid Request
          schema:
            type: string
        "500":
          description: Internal Server Error
          schema:
            type: string
      security:
      - BearerAuth: []
      summary: Create Ticket
      tags:
      - Support
  /api/v1/support/tickets/{id}:
    get:
      consumes:
      - application/json
      description: Returns ticket details and chat history.
      parameters:
      - description: Ticket ID
        in: path
        name: id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            type: object
        "404":
          description: Not Found
          schema:
            type: string
        "500":
          description: Internal Server Error
          schema:
            type: string
      security:
      - BearerAuth: []
      summary: Get Ticket Details
      tags:
      - Support
  /api/v1/support/tickets/{id}/messages:
    post:
      consumes:
      - application/json
      description: Adds a message to an existing ticket.
      parameters:
      - description: Ticket ID
        in: path
        name: id
        required: true
        type: string
      - description: Message
        in: body
        name: message
        required: true
        schema:
          type: object
      produces:
      - application/json
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/models.TicketMessage'
        "400":
          description: Invalid Request
          schema:
            type: string
        "500":
          description: Internal Server Error
          schema:
            type: string
      security:
      - BearerAuth: []
      summary: Add Ticket Message
      tags:
      - Support
  /api/v1/users:
    get:
      consumes:
      - application/json
      description: Returns a list of users belonging to the authenticated tenant.
      parameters:
      - description: 'Page number (default: 1)'
        in: query
        name: page
        type: integer
      - description: 'Items per page (default: 10, max: 100)'
        in: query
        name: limit
        type: integer
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            type: object
        "403":
          description: Forbidden
          schema:
            type: string
        "500":
          description: Internal Server Error
          schema:
            type: string
      security:
      - BearerAuth: []
      summary: List Users
      tags:
      - Users
    post:
      consumes:
      - application/json
      description: Creates a new user under the current tenant. Requires Admin role.
      parameters:
      - description: User Details
        in: body
        name: user
        required: true
        schema:
          type: object
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            type: object
        "400":
          description: Invalid Request
          schema:
            type: string
        "403":
          description: Forbidden
          schema:
            type: string
        "500":
          description: Internal Server Error
          schema:
            type: string
      security:
      - BearerAuth: []
      summary: Create User
      tags:
      - Users
  /api/v1/users/{id}:
    delete:
      consumes:
      - application/json
      description: Deletes a user by ID. Must belong to the same tenant.
      parameters:
      - description: User ID
        in: path
        name: id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: User deleted
          schema:
            type: string
        "403":
          description: Forbidden
          schema:
            type: string
        "500":
          description: Internal Server Error
          schema:
            type: string
      security:
      - BearerAuth: []
      summary: Delete User
      tags:
      - Users
    patch:
      consumes:
      - application/json
      description: Updates user details (Name, Email, Active Status)
      parameters:
      - description: User ID
        in: path
        name: id
        required: true
        type: string
      - description: User Updates
        in: body
        name: user
        required: true
        schema:
          type: object
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            type: object
        "403":
          description: Forbidden
          schema:
            type: string
        "500":
          description: Internal Server Error
          schema:
            type: string
      security:
      - BearerAuth: []
      summary: Update User
      tags:
      - Users
  /api/v1/users/me/avatar:
    post:
      consumes:
      - multipart/form-data
      description: Uploads a profile picture for the current user.
      parameters:
      - description: Avatar File
        in: formData
        name: file
        required: true
        type: file
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            additionalProperties:
              type: string
            type: object
        "400":
          description: Invalid Request
          schema:
            type: string
        "500":
          description: Internal Server Error
          schema:
            type: string
      security:
      - BearerAuth: []
      summary: Upload Avatar
      tags:
      - Users
  /api/v1/users/me/profile:
    patch:
      consumes:
      - application/json
      description: Updates the current user's profile.
      parameters:
      - description: Profile Details
        in: body
        name: user
        required: true
        schema:
          type: object
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            type: object
        "400":
          description: Invalid Request
          schema:
            type: string
        "500":
          description: Internal Server Error
          schema:
            type: string
      security:
      - BearerAuth: []
      summary: Update My Profile
      tags:
      - Users
swagger: "2.0"
