pattern

Auth Service

What is Auth Service?

Auth service is a system that registers and authenticates users for all applications and services for HotBox Technology. This means that future projects, regardless of whether they have to do with Azapay or not, will have to use this Auth service for its registration and authentication process. Any eternal developer engaged will not build their authentication service but will rely on this service for their authentication. In other words, see it as like sign-in with Google. FYI we need to build that system.

Architecture

Below is the UML Diagram plan for this project.

UML Diagram Project Plan

Routes

Auth

POST("/auth/sign-in")

Request Body

								
{
	"email" :"required",
	"password" :"required"
}
								
							
POST("/auth/sign-up")

Request Body

								
{
	"firstName": "required",
	"lastName": "required",
	"email" :"required",
	"password" :"required"
}
								
							
POST("/auth/resend-verification-code/:email")
PUT("/auth/verify-code/:email/:code")
POST("/auth/forgot-password/:email")
PUT("/auth/forgot-password/:email/:code/:newPassword")
GET("/auth/authenticate/:token")
POST("/auth/auth/refresh-token/:token")

Users

GET("/users") or POST("/users")

Request Header

								
{
	 "x-auth-token": "required" or "x-api-token": "required"
}
								
							

Request Body

								
{
	"more": "boolean | required"
	"filter": "boolean | required"
	"pageNumber": 1, // required
	"batchNumber": 10, // required`
	"sort": "required", // ASC | DESC
	"orderBy" :"required", // go to GET("/allowed-query/fields/users") to see accepted fields
	"groups": [{
		"filterGroupCondition":"required" // AND | OR
		"filterSearchCondition":"required" // AND | OR
		"filters": [{
			"filterOption": "eq",
			"field": "", // go to GET("/allowed-query/fields/users") to see accepted fields
			"value": "user input",
			"dataType": "string" // string | number | bool | date | dateTime
		}]
	}]
}
								
							
GET("/users/details/:id")

Request Header

								
{
	 "x-auth-token": "required" or "x-api-token": "required"
}
								
							
PUT("/users/update/:id")

Request Header

								
{
	 "x-auth-token": "required" or "x-api-token": "required"
}
								
							

Request Body

								
{
	"firstName": "",
	"lastName": "",
	"email": "",
	"profile": {
		"bio": "",
		"age": 0,
		"gender": "",
		"maritalStatus": "",
		"address": [{
			"country": "",
			"state": "",
			"address": "",
		}],
		"phoneNumbers": [{
			"phoneNumber": ""
		}]
	}
}
								
							

Profile

GET("/users/profile") or POST("/users/profile")

Request Header

								
{
	 "x-auth-token": "required" or "x-api-token": "required"
}
								
							

Request Body

								
{
	"more": "boolean | required"
	"filter": "boolean | required"
	"pageNumber": 1, // required
	"batchNumber": 10, // required`
	"sort": "required", // ASC | DESC
	"orderBy" :"required", // go to GET("/allowed-query/fields/profile") to see accepted fields
	"groups": [{
		"filterGroupCondition":"required" // AND | OR
		"filterSearchCondition":"required" // AND | OR
		"filters": [{
			"filterOption": "eq",
			"field": "", // go to GET("/allowed-query/fields/profile") to see accepted fields
			"value": "user input",
			"dataType": "string" // string | number | bool | date | dateTime
		}]
	}]
}
								
							
GET("/users/profile/details/:id")

Request Header

								
{
	 "x-auth-token": "required" or "x-api-token": "required"
}
								
							
PUT("/users/profile/update/:id")

Request Header

								
{
	 "x-auth-token": "required" or "x-api-token": "required"
}
								
							

Request Body

								
{
	"userId": "",
	"bio": "",
	"age" 0,
	"gender": "",
	"maritalStatus": ""
}
								
							

Address

GET("/users/profile/address") or POST("/users/profile/address")

Request Header

								
{
	 "x-auth-token": "required" or "x-api-token": "required"
}
								
							

Request Body

								
{
	"more": "boolean | required"
	"filter": "boolean | required"
	"pageNumber": 1, // required
	"batchNumber": 10, // required`
	"sort": "required", // ASC | DESC
	"orderBy" :"required", // go to GET("/allowed-query/fields/address") to see accepted fields
	"groups": [{
		"filterGroupCondition":"required" // AND | OR
		"filterSearchCondition":"required" // AND | OR
		"filters": [{
			"filterOption": "eq",
			"field": "", // go to GET("/allowed-query/fields/address") to see accepted fields
			"value": "user input",
			"dataType": "string" // string | number | bool | date | dateTime
		}]
	}]
}
								
							
GET("/users/profile/details/:id")

Request Header

								
{
	 "x-auth-token": "required" or "x-api-token": "required"
}
								
							
POST("/users/profile/address/create")

Request Header

								
{
	 "x-auth-token": "required" or "x-api-token": "required"
}
								
							

Request Body

								
{
	"userId":"required",
	"userProfileId":"required",
	"country":"required",
	"state":"required",
	"address":"required"
}
								
							
PUT("/users/profile/address/update/:id")

Request Header

								
{
	 "x-auth-token": "required" or "x-api-token": "required"
}
								
							

Request Body

								
{
	"userId":"",
	"userProfileId":"",
	"country":"",
	"state":"",
	"address":""
}
								
							

Phone Number

GET("/users/profile/phone-numbers") or POST("/users/profile/phone-numbers")

Request Header

								
{
	 "x-auth-token": "required" or "x-api-token": "required"
}
								
							

Request Body

								
{
	"more": "boolean | required"
	"filter": "boolean | required"
	"pageNumber": 1, // required
	"batchNumber": 10, // required`
	"sort": "required", // ASC | DESC
	"orderBy" :"required", // go to GET("/allowed-query/fields/phone-numbers") to see accepted fields
	"groups": [{
		"filterGroupCondition":"required" // AND | OR
		"filterSearchCondition":"required" // AND | OR
		"filters": [{
			"filterOption": "eq",
			"field": "", // go to GET("/allowed-query/fields/phone-numbers") to see accepted fields
			"value": "user input",
			"dataType": "string" // string | number | bool | date | dateTime
		}]
	}]
}
								
							
GET("/users/profile/phone-numbers/details/:id")

Request Header

								
{
	 "x-auth-token": "required" or "x-api-token": "required"
}
								
							
POST("/users/profile/phone-numbers/create")

Request Header

								
{
	 "x-auth-token": "required" or "x-api-token": "required"
}
								
							

Request Body

								
{
	"userId":"required",
	"userProfileId":"required",
	"phoneNumbers":"required"
}
								
							
PUT("/users/profile/phone-numbers/update/:id")

Request Header

								
{
	 "x-auth-token": "required" or "x-api-token": "required"
}
								
							

Request Body

								
{
	"userId":"",
	"userProfileId":"",
	"phoneNumber":""
}
								
							

Webhooks

GET("/webhook") or POST("/webhook")

Request Header

								
{
	 "x-auth-token": "required" or "x-api-token": "required"
}
								
							

Request Body

								
{
	"more": "boolean | required"
	"filter": "boolean | required"
	"pageNumber": 1, // required
	"batchNumber": 10, // required`
	"sort": "required", // ASC | DESC
	"orderBy" :"required", // go to GET("/allowed-query/fields/webhook") to see accepted fields
	"groups": [{
		"filterGroupCondition":"required" // AND | OR
		"filterSearchCondition":"required" // AND | OR
		"filters": [{
			"filterOption": "eq",
			"field": "", // go to GET("/allowed-query/fields/webhook") to see accepted fields
			"value": "user input",
			"dataType": "string" // string | number | bool | date | dateTime
		}]
	}]
}
								
							
GET("/webhook/details/:id")

Request Header

								
{
	 "x-auth-token": "required" or "x-api-token": "required"
}
								
							
POST("/webhook/create")

Request Header

								
{
	 "x-auth-token": "required" or "x-api-token": "required"
}
								
							

Request Body

								
{
	"webhookUrl": "required",
	"record": "required" // user | token
}
								
							
PUT("/webhook/update/:id")

Request Header

								
{
	 "x-auth-token": "required" or "x-api-token": "required"
}
								
							

Request Body

								
{
	"webhookUrl": "",
	"record": ""
}
								
							

The webhook will return this for record = "user"

								
{
	"data": [
		{
			"id": "018d9ad0-8174-73a4-b070-10a4b34a7105",
			"firstName": "will",
			"lastName": "smith",
			"email": "w@g.com",
			"isVerified": false,
			"createdAt": "2024-02-11T19:56:12.403645Z",
			"profile": {
				"id": "018d9ad0-8174-7d58-a76b-b00746be1824",
				"bio": "",
				"age": 0,
				"gender": "",
				"maritalStatus": "",
				"createdAt": "2024-02-11T19:56:12.403645Z",
				"address": [
					{
						"id": "018d9b25-e0aa-7354-b235-23c52d51af55",
						"country": "Nigeria",
						"state": "FCT",
						"address": "N0 4 Address",
						"createdAt": "2024-02-11T19:56:12.403645Z"
					},
					{
						"id": "018d9b1e-ed2c-7139-b9ac-4f34926b494d",
						"country": "Nigeria",
						"state": "FCT",
						"address": "N0 3 Address",
						"createdAt": "2024-02-11T19:56:12.403645Z"
					},
				],
				"phoneNumbers": [
					{
						"id": "018d9afd-b496-7078-9d7c-45b8acb77dc9",
						"phoneNumber": "08018374627",
						"createdAt": "2024-02-11T19:56:12.403645Z"
					},
					{
						"id": "018d9ae9-6c6b-7eba-97dc-98ea15c9c8c3",
						"phoneNumber": "08018374627",
						"createdAt": "2024-02-11T19:56:12.403645Z"
					}
				]
			}
		}
	],
	"type": "success",
	"status": 200,
	"message": "success",
	"pageNumber": 1,
	"batchNumber": 1,
	"totalRecords": 1
}
								
							

For record = "token"

								
{
	"data": [
		{
			"id": "018d9ad0-8174-73a4-b070-10a4b34a7105",
			"userId": "018d9ad0-8174-7d58-a76b-b00746be1824",
			"token": "r0xqAe8rZxdQ61kSLFhChFzRFzDwMVWEbvEsXNzBfTdauZutkd",
			"expireAt": "2024-02-11T19:56:12.403645Z"
		}
	],
	"type": "success",
	"status": 200,
	"message": "success",
	"pageNumber": 1,
	"batchNumber": 1,
	"totalRecords": 1
}
								
							

Deployment

Docker

Docker is a set of platform as a service products that use OS-level virtualization to deliver software in packages called containers. The service has both free and premium tiers. The software that hosts the containers is called Docker Engine.

VPS

VPS can stand for virtual private server, which is a type of hosting service that uses virtualization technology. VPSs are virtual machines that run their own operating system and have their own dedicated resources, including CPU, RAM, storage, and bandwidth.

NGINX

Nginx is a web server that can also be used as a reverse proxy, load balancer, mail proxy and HTTP cache.

Dockerfile

A Dockerfile is a that contains instructions for building a Docker image. Docker images are used to create Docker containers, which are isolated, lightweight, and portable execution environments. Dockerfiles are made up of a series of commands, each of which tells Docker how to build the image. The commands are executed in order, and each one builds upon the previous one.

Docker Compose File

A Docker Compose file is a file that defines and runs multi-container Docker applications. With Compose, you can create a YAML file to define the services and networks for your application. Then, with a single command, you can create and start all the services from your configuration. To create a Docker Compose file, you need to define the services that make up your application. Each service is defined by a YAML block that specifies the image, ports, volumes, and other configuration options for the container.

CI/CD Pipline

The .gitlab-ci.yml file is a YAML file that defines project configuration in GitLab CI. It is placed at the root of the repository. The .gitlab-ci.yml file defines: