This document explores the design of Sporty, an API for sports community. It provides users with a bunch of training prograns and products/tools for the sports they love.
We will use a basic MVC pattern, where a single server is deployed on a cloud provider next to a relational database, and serving HTTP traffic from a secured JWT-based API endpoints.
We'll use SQL Server relational database (schema follows) to fast retrieval of data. Entity Framework Core as a Database ORM, although. Data will be stored on the server on a separate, backed up volume for resilience.
We'll need at least the following entities to implement the service:
Users:
| Column | Type |
|---|---|
| ID | uniqueidentifier |
| First/Last name | nvarchar |
| Password | nvarchar |
| nvarchar | |
| Username | nvarchar |
| City | nvarchar |
| Street | nvarchar |
| BuildingNumber | nvarchar |
| RefreshToken_Token | nvarchar |
| RefreshToken_CreatedOn | nvarchar |
| RefreshToken_ExpiresOn | nvarchar |
CreditCards:
| Column | Type |
|---|---|
| Id | uniqueidentifier |
| UserId | uniqueidentifier |
| CreditCardNum | nvarchar |
| Zipcode | nvarchar |
| ExpirationDate | nvarchar |
Sports:
| Column | Type |
|---|---|
| ID | uniqueidentifier |
| Name | nvarchar |
UserInterests:
| Column | Type |
|---|---|
| UserId | uniqueidentifier |
| SprotId | uniqueidentifier |
Levels:
| Column | Type |
|---|---|
| ID | uniqueidentifier |
| SprotId | uniqueidentifier |
| Description | nvarchar |
Programs:
| Column | Type |
|---|---|
| Id | uniqueidentifier |
| SprotId | uniqueidentifier |
| Name | nvarchar |
| Description | nvarchar |
| DescriptionMinimized | nvarchar |
| Provider | nvarchar |
| ImageUrl | nvarchar |
| Location | nvarchar |
| PricePerMonth | decimal |
| LevelId | uniqueidentifier |
ReservedPrograms:
| Column | Type |
|---|---|
| UserId | uniqueidentifier |
| ProgramId | uniqueidentifier |
| Date | datetimeoffset |
Products:
| Column | Type |
|---|---|
| Id | uniqueidentifier |
| SprotId | uniqueidentifier |
| Name | nvarchar |
| Description | nvarchar |
| DescriptionMinimized | nvarchar |
| Price | decimal |
| ImageUrl | nvarchar |
| Quantity | int |
| Brand | nvarchar |
Orders:
| Column | Type |
|---|---|
| Id | uniqueidentifier |
| UserId | uniqueidentifier |
| Date | datetimeoffset |
| TotalPrice | decimal |
| City | nvarchar |
| Street | nvarchar |
| BuildingNumber | nvarchar |
| CreditCardNum | nvarchar |
| Zipcode | nvarchar |
| ExpirationDate | nvarchar |
OrderItems:
| Column | Type |
|---|---|
| OrderId | uniqueidentifier |
| ProductId | uniqueidentifier |
| Amount | int |
| TotalItemPrice | decimal |
A simple HTTP server is responsible for authentication, serving stored data.
- ASP.NET Core is selected for implementing the server for Scalability.
- Entity Framework Core to be used as an ORM.
For v1, a simple JWT-based auth mechanism is to be used, with passwords encrypted and stored in the database.
Auth:
api/Auth/signup [POST]
api/Auth/login [POST]
api/Auth/refreshToken [GET]
api/Auth/ForgetPassword [POST]
api/Auth/CheckResetToken [POST]
api/Auth/ResetPassword [POST]
UserProfile:
api/users/profile [POST]
api/users/profile [PUT]
Sport:
api/sports [GET]
api/sports [POST]
Order:
api/orders/history [GET]
api/orders [POST]
Product:
api/products [GET]
api/products [POST]
api/products/{productId} [GET]
TrainingPrograms:
api/programs [GET]
api/programs [POST]
api/programs/{programId} [GET]
api/programs/history [GET]
api/programs/{programId}/enrill [GET]
For now we will start with a mobile client, possibly adding web clients later.
The mobile client will be implemented in Flutter.
The code will be hosted on SmarterASP.NET.
We'll deploy the server to a (likely shared) VPS for flexibility. And we'll start with a manual deployment, to be automated later using Github actions or similar.
Deployed Link: http://SportyAPI.somee.com || http://ahmedssaleem-001-site1.etempurl.com