Skip to content

Backend

Mateusz Martin edited this page Jun 2, 2023 · 4 revisions

Wallet App API Documentation

Welcome to the documentation of the Wallet App API. Our API has been fully developed by Małgorzata Marczyńska, our talented developer who has put in a lot of effort and dedication. The backend logic takes care of user account handling, authorization, and transactions management. Our backend is hosted on Render, and the database is hosted on MongoDB. Backend base URL: https://waller-api.onrender.com/api/

Authorization

Authorization is done using a JWT token, which must be included in the request header Authorization. The token can be obtained from the user object in the database and is provided in the response of the /users/auth/log-in endpoint.

If the authorization fails, you will receive the following response:

{
  "status": "error",
  "code": 401,
  "message": "Unauthorized",
  "data": "Unauthorized"
}

Models

Users

{
  "password": {
    "type": "String",
    "minlength": 6,
    "maxlength": 100,
    "required": true
  },
  "email": {
    "type": "String",
    "minlength": 3,
    "maxlength": 50,
    "required": true,
    "unique": true
  },
  "username": {
    "type": "String",
    "minlength": 1,
    "maxlength": 12
  },
  "token": {
    "type": "String",
    "default": null
  },
  "verify": {
    "type": "Boolean",
    "default": false
  },
  "verificationToken": {
    "type": "String",
    "required": true,
    "default": null
  },
  "balance": {
    "type": "Number",
    "default": 0
  },
  "owner": {
    "type": "Schema.Types.ObjectId",
    "ref": "user"
  }
}

Transactions

{
  "transactionDate": {
    "type": "String",
    "default": "dateNow"
  },
  "typeOfTransaction": {
    "type": "String",
    "enum": ["Income", "Expense"],
    "default": "Expense"
  },
  "categoryId": {
    "type": "String"
  },
  "comment": {
    "type": "String",
    "default": ""
  },
  "amountOfTransaction": {
    "type": "Number",
    "default": 0
  }
}

Categories

{
  "name": {
    "type": "String"
  }
}

Endpoints

Users

POST /users/auth/sign-up

Used to create a new user account.

  • Does not require authorization.
  • Does not accept parameters.

Request Body:

{
  "email": "example@mail.com",
  "password": "SamplePass123",
  "doubledPassword": "SamplePass123",
  "username": "Josh"
}

Responses:

  • On success:
{
  "status": "Success",
  "code": 201,
  "message": "Registration successful! Verification e-mail has just been sent, please verify your e-mail",
  "data": {
    "newUser": {
      "id": "String",
      "email": "String",
      "username": "String",
      "balance": "Number",
      "verificationToken": "string"
    }
  }
}
  • When a field is missing:

json
{
  "status": "error",
  "message": "missing field"
}
  • Incorrect credentials:
{
  "status": "Unauthorized",
  "code": 401,
  "message": "Incorrect login or password or you have not verified your email yet. If you have not verified yet, please check your email inbox or go to 'api/users/verify' to get a second verification email",
  "data": "Bad credentials"
}

POST /users/auth/log-in

Used to log in to a user account.

  • Does not require authorization.
  • Does not accept parameters.

Request Body:

{
  "email": "example@mail.com",
  "password": "SamplePass123"
}

Responses:

  • On success:
{
  "status": "Success",
  "code": 200,
  "data": {
    "token": "String",
    "user": {
      "id": "String",
      "username": "String",
      "email": "String",
      "balance": "Number"
    }
  }
}
  • When a field is missing:
{
  "status": "error",
  "message": "missing field"
}
  • Incorrect credentials:
{
  "status": "Unauthorized",
  "code": 401,
  "message": "Incorrect login or password or you have not verified your email yet. If you have not verified yet, please check your email inbox or go to 'api/users/verify' to get a second verification email",
  "data": "Bad credentials"
}

GET /users/verify/:verificationToken

Used to verify a user's email.

  • Does not require authorization.
  • Does not accept a request body.

Parameters:

  • verificationToken (String, required): Example: "ad8eu2j89daj892JDW82j"

Responses:

  • On success:
{
  "status": "Verification successful, please log in",
  "code": 200
}
  • When already verified or the token doesn't exist:
{
  "status": "error",
  "message": "User not found"
}

POST /users/verify

Used to send a verification email again.

  • Does not require authorization.
  • Does not accept parameters.

Request Body:

{
  "email": "example@mail.com"
}

Responses:

  • On success:
{
  "code": 200,
  "message": "Verification email sent"
}
  • Email has not been provided:
{
  "status": "error",
  "message": "missing required field email"
}
  • When the user is already verified:
{
  "message": "Verification has already been passed, please log in"
}

GET /users/current

Used to get the current user's data.

  • Requires authorization.
  • Does not accept parameters or a request body.

Responses:

  • On success:
{
  "status": "Success",
  "code": 200,
  "data": {
    "id": "String",
    "email": "String",
    "username": "String",
    "balance": "Number"
  }
}

POST /users/auth/log-out

Used to log out from a user account.

  • Requires authorization.
  • Does not accept parameters or a request body.

Responses:

  • On success:
{
  "status": "No content",
  "code": 204,
  "data": "Not found"
}

DELETE /users/auth/sign-out

Used to delete a user account.

  • Requires authorization.
  • Does not accept parameters or a request body.

Responses:

  • On success:
{
  "status": "No content",
  "code": 204,
  "data": "Not found"
}

Transactions

GET /transactions

Returns all the user's transactions.

  • Requires authorization.
  • Does not accept parameters or a request body.

Response:

On success:

{
  "status": "success",
  "code": 200,
  "countTransactions": "Number",
  "totalPages": "Number",
  "currentPage": "Number",
  "limit": "Number",
  "data": {
    "balance": "Number",
    "userId": "String",
    "transactions": "Array"
  }
}

GET /transactions/:transactionId

Returns the transaction with the provided ID.

  • Requires authorization.

Parameters:

  • transactionId (String, required): Example: "dawlij289jf9ajn98a22j"

Response:

On success:

{
  "status": "success",
  "code": 200,
  "data": {
    "transaction": "Object"
  }
}

If the transaction is not found:

{
  "status": "error",
  "code": 404,
  "message": "Not found transaction id: ${transactionId}",
  "data": "Not Found"
}

POST /transactions

Adds a new transaction entry.

  • Requires authorization.
  • Does not accept parameters.

Request Body:

{
  "typeOfTransaction": "String (required)",
  "category": "String (required)",
  "amountOfTransaction": "Number (required)",
  "transactionDate": "String (required)",
  "comment": "String (required)"
}

Response:

On success:

{
  "status": "success",
  "code": 200,
  "data": {
    "updatedTransaction": "Object",
    "updatedBalance": "Number"
  }
}

If there is an incompatibility between the typeOfTransaction and category (e.g., type = "expense", category = "income"):

{
  "status": "error",
  "code": 400,
  "message": "Bad request"
}

PATCH /transactions/:transactionId

Edits a transaction.

  • Requires authorization.

Parameters:

  • transactionId (String, required): Example: "dawlij289jf9ajn98a22j"

Request Body:

At least one field from the Transaction model. Example:

{
  "comment": "Edited sample transaction",
  "amountOfTransaction": 666
}

Response:

On success:

{
  "status": "created",
  "code": 201,
  "data": {
    "newTransaction": "Object",
    "updatedBalance": "Number"
  }
}

If the transaction is not found:

{
  "status": "error",
  "code": 404,
  "message": "Not found transaction id: ${transactionId}",
  "data": "Not Found"
}

If there is an incompatibility between the typeOfTransaction and category (e.g., type = "expense", category = "income"):

{
  "status": "error",
  "code": 400,
  "message": "Bad request"
}

DELETE /transactions/:transactionId

Deletes a transaction.

  • Requires authorization.

Parameters:

  • transactionId (String, required): Example: "dawlij289jf9ajn98a22j"

Response:

On success:

{
  "status": "No content",
  "code": 204,
  "data": "No Content"
}

If the transaction is not found:

{
  "status": "error",
  "code": 404,
  "message": "Not found transaction id: ${transactionId}",
  "data": "Not Found"
}

Summary

GET /transaction-categories

Returns all categories.

  • Requires authorization.
  • Does not accept parameters or a request body.

Response:

On success:

{
 "status": "success",
 "code": 200,
 "data": { "allCategories": "Objects Array" },
}

GET /transactions-summary

Returns finances summary

  • Requires authorization.
  • Does not accept parameters or a request body.

Response:

On success:

{
 "status": "success",
 "code": 200,
 "data": {
          "incomeValue":"Number",
          "expenseValue":"Number",
          "balanceForMonth":"Number",
          "usedCategoryIds":"Array",
          "categoryIdValues":"Array",
         },
}