{
  "openapi" : "3.0.1",
  "info" : {
    "title" : "PropFlow API",
    "description" : "REST API for managing short-term rental properties and their financial transactions.\n\n**Authentication.** Register at `POST /api/auth/signup`, then exchange credentials for a token at `POST /api/auth/signin`. Click **Authorize** and paste the `accessToken` value.\n\n**Authorization.** Every property and transaction read is scoped to the authenticated owner. Requesting a resource belonging to another account returns `404` rather than `403`, so that response codes cannot be used to discover which ids exist.\n\n**Errors.** All failures are RFC 7807 `application/problem+json`, carrying `type`, `title`, `status`, `detail`, `instance`, and `timestamp`. Validation failures add an `errors` object keyed by field name. Unexpected failures add a `correlationId` that matches the server log entry; stack traces and SQL are never returned.\n\nThis is a portfolio project. It is not deployed and not production-hardened -- see the repository README for the current list of known limitations.",
    "license" : {
      "name" : "MIT"
    },
    "version" : "v1"
  },
  "servers" : [ {
    "url" : "http://localhost",
    "description" : "Generated server url"
  } ],
  "security" : [ {
    "bearerAuth" : [ ]
  } ],
  "paths" : {
    "/api/transactions/{id}" : {
      "get" : {
        "tags" : [ "transaction-controller" ],
        "operationId" : "getById",
        "parameters" : [ {
          "name" : "id",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "integer",
            "format" : "int64"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "*/*" : {
                "schema" : {
                  "$ref" : "#/components/schemas/TransactionResponse"
                }
              }
            }
          }
        }
      },
      "put" : {
        "tags" : [ "transaction-controller" ],
        "operationId" : "update",
        "parameters" : [ {
          "name" : "id",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "integer",
            "format" : "int64"
          }
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/TransactionRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "*/*" : {
                "schema" : {
                  "$ref" : "#/components/schemas/TransactionResponse"
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "transaction-controller" ],
        "operationId" : "delete",
        "parameters" : [ {
          "name" : "id",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "integer",
            "format" : "int64"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "OK"
          }
        }
      }
    },
    "/api/properties/{id}" : {
      "get" : {
        "tags" : [ "property-controller" ],
        "operationId" : "getProperty",
        "parameters" : [ {
          "name" : "id",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "integer",
            "format" : "int64"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "*/*" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PropertyResponse"
                }
              }
            }
          }
        }
      },
      "put" : {
        "tags" : [ "property-controller" ],
        "operationId" : "updateProperty",
        "parameters" : [ {
          "name" : "id",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "integer",
            "format" : "int64"
          }
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/PropertyRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "*/*" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PropertyResponse"
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "property-controller" ],
        "operationId" : "deleteProperty",
        "parameters" : [ {
          "name" : "id",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "integer",
            "format" : "int64"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "OK"
          }
        }
      }
    },
    "/api/transactions" : {
      "get" : {
        "tags" : [ "transaction-controller" ],
        "operationId" : "getAll",
        "parameters" : [ {
          "name" : "pageable",
          "in" : "query",
          "required" : true,
          "schema" : {
            "$ref" : "#/components/schemas/Pageable"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "*/*" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PagedResponseTransactionSummaryResponse"
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "transaction-controller" ],
        "operationId" : "create",
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/TransactionRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "*/*" : {
                "schema" : {
                  "$ref" : "#/components/schemas/TransactionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/transactions/search" : {
      "post" : {
        "tags" : [ "transaction-controller" ],
        "operationId" : "search",
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/TransactionSearchRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "*/*" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PagedResponseTransactionSummaryResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/properties" : {
      "get" : {
        "tags" : [ "property-controller" ],
        "operationId" : "getAllProperties",
        "parameters" : [ {
          "name" : "pageable",
          "in" : "query",
          "required" : true,
          "schema" : {
            "$ref" : "#/components/schemas/Pageable"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "*/*" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PagedResponsePropertyResponse"
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "property-controller" ],
        "operationId" : "createProperty",
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/PropertyRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "*/*" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PropertyResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/auth/signup" : {
      "post" : {
        "tags" : [ "auth-controller" ],
        "operationId" : "signUp",
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/SignUpRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "*/*" : {
                "schema" : {
                  "$ref" : "#/components/schemas/UserResponse"
                }
              }
            }
          }
        },
        "security" : [ ]
      }
    },
    "/api/auth/signin" : {
      "post" : {
        "tags" : [ "auth-controller" ],
        "operationId" : "signIn",
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/SignInRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "*/*" : {
                "schema" : {
                  "$ref" : "#/components/schemas/AuthResponse"
                }
              }
            }
          }
        },
        "security" : [ ]
      }
    },
    "/api/users" : {
      "get" : {
        "tags" : [ "user-controller" ],
        "operationId" : "getAllUsers",
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "*/*" : {
                "schema" : {
                  "type" : "array",
                  "items" : {
                    "$ref" : "#/components/schemas/UserResponse"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/users/{id}" : {
      "get" : {
        "tags" : [ "user-controller" ],
        "operationId" : "getUserById",
        "parameters" : [ {
          "name" : "id",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "integer",
            "format" : "int64"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "*/*" : {
                "schema" : {
                  "$ref" : "#/components/schemas/UserResponse"
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "user-controller" ],
        "operationId" : "deleteUser",
        "parameters" : [ {
          "name" : "id",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "integer",
            "format" : "int64"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "OK"
          }
        }
      }
    },
    "/api/users/me" : {
      "get" : {
        "tags" : [ "user-controller" ],
        "operationId" : "currentUser",
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "*/*" : {
                "schema" : {
                  "$ref" : "#/components/schemas/UserResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/transactions/property/{propertyId}" : {
      "get" : {
        "tags" : [ "transaction-controller" ],
        "operationId" : "getByPropertyId",
        "parameters" : [ {
          "name" : "propertyId",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "integer",
            "format" : "int64"
          }
        }, {
          "name" : "pageable",
          "in" : "query",
          "required" : true,
          "schema" : {
            "$ref" : "#/components/schemas/Pageable"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "*/*" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PagedResponseTransactionSummaryResponse"
                }
              }
            }
          }
        }
      }
    }
  },
  "components" : {
    "schemas" : {
      "TransactionRequest" : {
        "required" : [ "amount", "category", "date", "description", "propertyId", "type" ],
        "type" : "object",
        "properties" : {
          "propertyId" : {
            "type" : "integer",
            "format" : "int64"
          },
          "type" : {
            "type" : "string",
            "enum" : [ "EXPENSE", "INCOME" ]
          },
          "category" : {
            "type" : "string",
            "enum" : [ "BOOKING_PAYMENT", "CLEANING_FEE", "SECURITY_DEPOSIT", "LATE_CHECKOUT_FEE", "ADDITIONAL_GUEST_FEE", "OTHER_INCOME", "CLEANING", "MAINTENANCE", "UTILITIES", "SUPPLIES", "INSURANCE", "MORTGAGE", "PROPERTY_TAX", "PLATFORM_FEES", "MARKETING", "OTHER_EXPENSE", "TAXES", "HOA_FEES", "REPAIRS", "FURNISHING", "PROPERTY_MANAGEMENT", "PERMITS_LICENSES", "LEGAL_PROFESSIONAL" ]
          },
          "subcategory" : {
            "maxLength" : 255,
            "minLength" : 0,
            "type" : "string"
          },
          "description" : {
            "maxLength" : 255,
            "minLength" : 0,
            "type" : "string"
          },
          "amount" : {
            "minimum" : 0.01,
            "exclusiveMinimum" : false,
            "type" : "number"
          },
          "date" : {
            "type" : "string",
            "format" : "date-time"
          },
          "status" : {
            "type" : "string",
            "enum" : [ "PENDING", "PAID", "OVERDUE", "CANCELLED", "DISPUTED", "REFUNDED" ]
          },
          "paymentMethod" : {
            "type" : "string",
            "enum" : [ "CASH", "CREDIT_CARD", "DEBIT_CARD", "BANK_TRANSFER", "CHECK", "PAYPAL", "VENMO", "ZELLE", "OTHER" ]
          },
          "paymentReference" : {
            "maxLength" : 255,
            "minLength" : 0,
            "type" : "string"
          },
          "recurring" : {
            "type" : "boolean"
          },
          "frequency" : {
            "type" : "string",
            "enum" : [ "ONE_TIME", "DAILY", "WEEKLY", "BI_WEEKLY", "MONTHLY", "QUARTERLY", "SEMI_ANNUALLY", "ANNUALLY" ]
          },
          "vendor" : {
            "maxLength" : 255,
            "minLength" : 0,
            "type" : "string"
          },
          "receiptUrl" : {
            "maxLength" : 255,
            "minLength" : 0,
            "type" : "string"
          },
          "notes" : {
            "type" : "string"
          },
          "dueDate" : {
            "type" : "string",
            "format" : "date-time"
          },
          "paidAt" : {
            "type" : "string",
            "format" : "date-time"
          },
          "bookingReference" : {
            "maxLength" : 255,
            "minLength" : 0,
            "type" : "string"
          },
          "bookingId" : {
            "type" : "integer",
            "format" : "int64"
          },
          "tags" : {
            "type" : "array",
            "items" : {
              "maxLength" : 255,
              "minLength" : 0,
              "type" : "string"
            }
          },
          "metadata" : {
            "type" : "object",
            "additionalProperties" : {
              "type" : "string"
            }
          }
        }
      },
      "RefundResponse" : {
        "type" : "object",
        "properties" : {
          "refundAmount" : {
            "type" : "number"
          },
          "refundDate" : {
            "type" : "string",
            "format" : "date-time"
          },
          "refundReason" : {
            "type" : "string"
          },
          "refundReference" : {
            "type" : "string"
          }
        }
      },
      "TaxDetailsResponse" : {
        "type" : "object",
        "properties" : {
          "taxable" : {
            "type" : "boolean"
          },
          "taxCategory" : {
            "type" : "string"
          },
          "taxAmount" : {
            "type" : "number"
          },
          "deductible" : {
            "type" : "boolean"
          },
          "deductionCategory" : {
            "type" : "string"
          }
        }
      },
      "TransactionResponse" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "integer",
            "format" : "int64"
          },
          "propertyId" : {
            "type" : "integer",
            "format" : "int64"
          },
          "propertyName" : {
            "type" : "string"
          },
          "bookingReference" : {
            "type" : "string"
          },
          "bookingId" : {
            "type" : "integer",
            "format" : "int64"
          },
          "type" : {
            "type" : "string",
            "enum" : [ "EXPENSE", "INCOME" ]
          },
          "category" : {
            "type" : "string",
            "enum" : [ "BOOKING_PAYMENT", "CLEANING_FEE", "SECURITY_DEPOSIT", "LATE_CHECKOUT_FEE", "ADDITIONAL_GUEST_FEE", "OTHER_INCOME", "CLEANING", "MAINTENANCE", "UTILITIES", "SUPPLIES", "INSURANCE", "MORTGAGE", "PROPERTY_TAX", "PLATFORM_FEES", "MARKETING", "OTHER_EXPENSE", "TAXES", "HOA_FEES", "REPAIRS", "FURNISHING", "PROPERTY_MANAGEMENT", "PERMITS_LICENSES", "LEGAL_PROFESSIONAL" ]
          },
          "subcategory" : {
            "type" : "string"
          },
          "description" : {
            "type" : "string"
          },
          "amount" : {
            "type" : "number"
          },
          "status" : {
            "type" : "string",
            "enum" : [ "PENDING", "PAID", "OVERDUE", "CANCELLED", "DISPUTED", "REFUNDED" ]
          },
          "paymentMethod" : {
            "type" : "string",
            "enum" : [ "CASH", "CREDIT_CARD", "DEBIT_CARD", "BANK_TRANSFER", "CHECK", "PAYPAL", "VENMO", "ZELLE", "OTHER" ]
          },
          "paymentReference" : {
            "type" : "string"
          },
          "recurring" : {
            "type" : "boolean"
          },
          "frequency" : {
            "type" : "string",
            "enum" : [ "ONE_TIME", "DAILY", "WEEKLY", "BI_WEEKLY", "MONTHLY", "QUARTERLY", "SEMI_ANNUALLY", "ANNUALLY" ]
          },
          "vendor" : {
            "type" : "string"
          },
          "receiptUrl" : {
            "type" : "string"
          },
          "notes" : {
            "type" : "string"
          },
          "taxDetails" : {
            "$ref" : "#/components/schemas/TaxDetailsResponse"
          },
          "refund" : {
            "$ref" : "#/components/schemas/RefundResponse"
          },
          "tags" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            }
          },
          "metadata" : {
            "type" : "object",
            "additionalProperties" : {
              "type" : "string"
            }
          },
          "approvalStatus" : {
            "type" : "string"
          },
          "approvedBy" : {
            "type" : "string"
          },
          "approvedDate" : {
            "type" : "string",
            "format" : "date-time"
          },
          "date" : {
            "type" : "string",
            "format" : "date-time"
          },
          "dueDate" : {
            "type" : "string",
            "format" : "date-time"
          },
          "paidAt" : {
            "type" : "string",
            "format" : "date-time"
          },
          "createdAt" : {
            "type" : "string",
            "format" : "date-time"
          },
          "updatedAt" : {
            "type" : "string",
            "format" : "date-time"
          }
        }
      },
      "PropertyRequest" : {
        "required" : [ "active", "address", "basePrice", "bathrooms", "bedrooms", "maxGuests", "name" ],
        "type" : "object",
        "properties" : {
          "name" : {
            "maxLength" : 255,
            "minLength" : 0,
            "type" : "string"
          },
          "address" : {
            "maxLength" : 255,
            "minLength" : 0,
            "type" : "string"
          },
          "description" : {
            "maxLength" : 255,
            "minLength" : 0,
            "type" : "string"
          },
          "basePrice" : {
            "maximum" : 9.999999999E7,
            "exclusiveMaximum" : false,
            "type" : "number"
          },
          "maxGuests" : {
            "maximum" : 100,
            "minimum" : 1,
            "type" : "integer",
            "format" : "int32"
          },
          "bedrooms" : {
            "maximum" : 50,
            "minimum" : 0,
            "type" : "integer",
            "format" : "int32"
          },
          "bathrooms" : {
            "maximum" : 50,
            "minimum" : 0,
            "type" : "integer",
            "format" : "int32"
          },
          "active" : {
            "type" : "boolean"
          },
          "strPermitNumber" : {
            "maxLength" : 255,
            "minLength" : 0,
            "type" : "string"
          },
          "houseRules" : {
            "type" : "string"
          },
          "checkInInstructions" : {
            "type" : "string"
          }
        }
      },
      "PropertyResponse" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "integer",
            "format" : "int64"
          },
          "ownerId" : {
            "type" : "integer",
            "format" : "int64"
          },
          "name" : {
            "type" : "string"
          },
          "address" : {
            "type" : "string"
          },
          "description" : {
            "type" : "string"
          },
          "basePrice" : {
            "type" : "number"
          },
          "maxGuests" : {
            "type" : "integer",
            "format" : "int32"
          },
          "bedrooms" : {
            "type" : "integer",
            "format" : "int32"
          },
          "bathrooms" : {
            "type" : "integer",
            "format" : "int32"
          },
          "active" : {
            "type" : "boolean"
          },
          "strPermitNumber" : {
            "type" : "string"
          },
          "houseRules" : {
            "type" : "string"
          },
          "checkInInstructions" : {
            "type" : "string"
          }
        }
      },
      "TransactionSearchRequest" : {
        "type" : "object",
        "properties" : {
          "startDate" : {
            "type" : "string",
            "format" : "date-time"
          },
          "endDate" : {
            "type" : "string",
            "format" : "date-time"
          },
          "minAmount" : {
            "type" : "number"
          },
          "maxAmount" : {
            "type" : "number"
          },
          "type" : {
            "type" : "string",
            "enum" : [ "EXPENSE", "INCOME" ]
          },
          "category" : {
            "type" : "string",
            "enum" : [ "BOOKING_PAYMENT", "CLEANING_FEE", "SECURITY_DEPOSIT", "LATE_CHECKOUT_FEE", "ADDITIONAL_GUEST_FEE", "OTHER_INCOME", "CLEANING", "MAINTENANCE", "UTILITIES", "SUPPLIES", "INSURANCE", "MORTGAGE", "PROPERTY_TAX", "PLATFORM_FEES", "MARKETING", "OTHER_EXPENSE", "TAXES", "HOA_FEES", "REPAIRS", "FURNISHING", "PROPERTY_MANAGEMENT", "PERMITS_LICENSES", "LEGAL_PROFESSIONAL" ]
          },
          "propertyId" : {
            "type" : "integer",
            "format" : "int64"
          },
          "status" : {
            "type" : "string",
            "enum" : [ "PENDING", "PAID", "OVERDUE", "CANCELLED", "DISPUTED", "REFUNDED" ]
          },
          "paymentMethod" : {
            "type" : "string",
            "enum" : [ "CASH", "CREDIT_CARD", "DEBIT_CARD", "BANK_TRANSFER", "CHECK", "PAYPAL", "VENMO", "ZELLE", "OTHER" ]
          },
          "recurring" : {
            "type" : "boolean"
          },
          "frequency" : {
            "type" : "string",
            "enum" : [ "ONE_TIME", "DAILY", "WEEKLY", "BI_WEEKLY", "MONTHLY", "QUARTERLY", "SEMI_ANNUALLY", "ANNUALLY" ]
          },
          "vendor" : {
            "type" : "string"
          },
          "approvalStatus" : {
            "type" : "string"
          },
          "overdue" : {
            "type" : "boolean"
          },
          "searchTerm" : {
            "type" : "string"
          },
          "page" : {
            "minimum" : 0,
            "type" : "integer",
            "format" : "int32"
          },
          "size" : {
            "maximum" : 100,
            "minimum" : 1,
            "type" : "integer",
            "format" : "int32"
          },
          "sortBy" : {
            "type" : "string"
          },
          "sortDirection" : {
            "type" : "string"
          }
        }
      },
      "PagedResponseTransactionSummaryResponse" : {
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/TransactionSummaryResponse"
            }
          },
          "page" : {
            "type" : "integer",
            "format" : "int32"
          },
          "size" : {
            "type" : "integer",
            "format" : "int32"
          },
          "totalElements" : {
            "type" : "integer",
            "format" : "int64"
          },
          "totalPages" : {
            "type" : "integer",
            "format" : "int32"
          },
          "last" : {
            "type" : "boolean"
          }
        }
      },
      "TransactionSummaryResponse" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "integer",
            "format" : "int64"
          },
          "propertyId" : {
            "type" : "integer",
            "format" : "int64"
          },
          "propertyName" : {
            "type" : "string"
          },
          "type" : {
            "type" : "string",
            "enum" : [ "EXPENSE", "INCOME" ]
          },
          "category" : {
            "type" : "string",
            "enum" : [ "BOOKING_PAYMENT", "CLEANING_FEE", "SECURITY_DEPOSIT", "LATE_CHECKOUT_FEE", "ADDITIONAL_GUEST_FEE", "OTHER_INCOME", "CLEANING", "MAINTENANCE", "UTILITIES", "SUPPLIES", "INSURANCE", "MORTGAGE", "PROPERTY_TAX", "PLATFORM_FEES", "MARKETING", "OTHER_EXPENSE", "TAXES", "HOA_FEES", "REPAIRS", "FURNISHING", "PROPERTY_MANAGEMENT", "PERMITS_LICENSES", "LEGAL_PROFESSIONAL" ]
          },
          "subcategory" : {
            "type" : "string"
          },
          "description" : {
            "type" : "string"
          },
          "amount" : {
            "type" : "number"
          },
          "status" : {
            "type" : "string",
            "enum" : [ "PENDING", "PAID", "OVERDUE", "CANCELLED", "DISPUTED", "REFUNDED" ]
          },
          "paymentMethod" : {
            "type" : "string",
            "enum" : [ "CASH", "CREDIT_CARD", "DEBIT_CARD", "BANK_TRANSFER", "CHECK", "PAYPAL", "VENMO", "ZELLE", "OTHER" ]
          },
          "recurring" : {
            "type" : "boolean"
          },
          "vendor" : {
            "type" : "string"
          },
          "date" : {
            "type" : "string",
            "format" : "date-time"
          },
          "dueDate" : {
            "type" : "string",
            "format" : "date-time"
          },
          "paidAt" : {
            "type" : "string",
            "format" : "date-time"
          }
        }
      },
      "SignUpRequest" : {
        "required" : [ "email", "password", "username" ],
        "type" : "object",
        "properties" : {
          "email" : {
            "maxLength" : 255,
            "minLength" : 0,
            "type" : "string"
          },
          "username" : {
            "maxLength" : 50,
            "minLength" : 3,
            "type" : "string"
          },
          "password" : {
            "maxLength" : 72,
            "minLength" : 8,
            "type" : "string"
          },
          "firstName" : {
            "maxLength" : 255,
            "minLength" : 0,
            "type" : "string"
          },
          "lastName" : {
            "maxLength" : 255,
            "minLength" : 0,
            "type" : "string"
          }
        }
      },
      "UserResponse" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "integer",
            "format" : "int64"
          },
          "email" : {
            "type" : "string"
          },
          "username" : {
            "type" : "string"
          },
          "firstName" : {
            "type" : "string"
          },
          "lastName" : {
            "type" : "string"
          },
          "role" : {
            "type" : "string",
            "enum" : [ "USER", "ADMIN" ]
          }
        }
      },
      "SignInRequest" : {
        "required" : [ "password", "username" ],
        "type" : "object",
        "properties" : {
          "username" : {
            "type" : "string"
          },
          "password" : {
            "type" : "string"
          }
        }
      },
      "AuthResponse" : {
        "type" : "object",
        "properties" : {
          "accessToken" : {
            "type" : "string"
          },
          "tokenType" : {
            "type" : "string"
          },
          "expiresIn" : {
            "type" : "integer",
            "format" : "int64"
          },
          "user" : {
            "$ref" : "#/components/schemas/UserResponse"
          }
        }
      },
      "Pageable" : {
        "type" : "object",
        "properties" : {
          "page" : {
            "minimum" : 0,
            "type" : "integer",
            "format" : "int32"
          },
          "size" : {
            "minimum" : 1,
            "type" : "integer",
            "format" : "int32"
          },
          "sort" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            }
          }
        }
      },
      "PagedResponsePropertyResponse" : {
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/PropertyResponse"
            }
          },
          "page" : {
            "type" : "integer",
            "format" : "int32"
          },
          "size" : {
            "type" : "integer",
            "format" : "int32"
          },
          "totalElements" : {
            "type" : "integer",
            "format" : "int64"
          },
          "totalPages" : {
            "type" : "integer",
            "format" : "int32"
          },
          "last" : {
            "type" : "boolean"
          }
        }
      }
    },
    "securitySchemes" : {
      "bearerAuth" : {
        "type" : "http",
        "description" : "Paste the accessToken returned by /api/auth/signin.",
        "scheme" : "bearer",
        "bearerFormat" : "JWT"
      }
    }
  }
}