openapi: 3.0.0
info:
  title: Search loan application
  description: Search filter to search, sort and retrieve the loan application.
  version: 1.0.0
servers:
  - url: https://a8fcbf71-9a93-43f6-ab3c-b95b953b1c57.mock.pstmn.io/

paths:
  /auth/login:
    post:
      tags:
      - Authentication
      summary: User Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AuthRequest'
      responses:
        '200':
          description: "OK"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthResponse'          
  /search-loans:
    post:
      tags:
        - Search
        - Sorting
      summary: Search and sort loan applications
      parameters:
        - name: sortBy
          in: query
          description: "Select the field to sort by"
          schema:
            type: string
            enum: [submissionDate, amount, customerName]
        - name: sortOrder
          in: query
          description: "Select asc = sort low to high, desc = sort high to low"
          schema:
            type: string
            enum: [asc, desc]
            default: desc  
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SearchRequest'
      responses:
        '200':
          description: "Search successful - 200 OK"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SearchResponse' 
        '400':
          description: "Bad Request - Validation Error"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: "No Record Found"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SearchResponse'    
  /dropdown/filters:
    get:
      tags:
        - Dropdowns
      summary: Get dropdown options
      responses:
        '200':
          description: OK
components:
  schemas:
    AuthRequest:
      type: object
      required:
        - username
        - password
      properties:
        username:
          type: string
          example: "loan.officer"
        password:
          type: string
          example: "Test@123"
    AuthResponse:
      type: object
      properties:
        status:
          type: string
          example: "success"
        token:
          type: string
          example: "eyJhbGciOiJIUzI1Ni..."
        expiresIn:
          type: number
          example: 3600
        issuedAt:
          type: string
          example: "2025-01-20T10:20:30Z"
        roles:
          type: array
          items:
            type: string
          example: ["LoanOfficer", "ReadOnlyUser"]
    SearchRequest:
      type: object
      required:
        - applicationYear  
      properties:
        acknowledgmentNumber:
          type: string
          minLength: 15
          maxLength: 15
          example: "ACK1234567890XY"
        loanStatus:
          type: string
          enum: [Approved, Pending, Rejected]
          example: "Pending"
        referenceNumber:
          type: string 
          example: "REF2025XYZ89012"
        applicationYear:
          type: integer
          default: 2026  # pre-select 2026
          enum: [2024, 2025, 2026]
          example: 2026
    SearchResponse:
      type: object
      properties:
        status:
          type: string
          example: "Success"
        applications:
          type: array
          items:
            $ref: '#/components/schemas/ApplicationRecord' 
    ApplicationRecord:
      type: object
      properties:
        applicationId: 
          type: string
          example: "APPID2025XYZ001"
        customerName:
          type: string
          example: "John Doe"
        loanType: 
          type: string
          enum: [Home Loan, Car Loan, Personal Loan]
          example: "Home Loan"
        status:
          type: string
          example: "Approved"
        amount:
          type: number 
          example: 250000
        submittedBy:
          type: string 
          example: "Officer A"
        submissionDate: 
          type: string  
          format: date
          example: "2025-01-20"
        branchCode:
          type: string 
          example: "BR001"
    ErrorResponse:
      type: object
      properties: 
        status:
          type: string
          example: "error"
        errorCode:
          type: string
          example: "INVALID_INPUT"
        message:
          type: string
          example: "Application Year is required"
            

                     
