---
# System prepended metadata

title: 'Zagel (SMS) [send sms system, payment system]'

---

# Zagel (SMS) [send sms system, payment system]

## Idea:
- We will install mobile Application on user's mobile; so that we can send sms(OTP service) with his pre-approved permission on user's mobile application.
- **User's benfites**: User will sell his unused SMS to be used by us and exchange it with an asset (Token)

## Technically What will happen as a user story [send sms system]:
- A customer(Developer [The potential customer]) wants to verify a mobile numbers with his application He will use three APIs from Us
  * **Send SMS**:
    This API will take The Mobile number which we will send the OTP to. 
    #### API scenario:
    1- Get mobile numbe fom request body
    2- Validte the mobile is really a mobile number or not based on [E.164](https://en.wikipedia.org/wiki/E.164) standard
    3- Generate OTP and sms body
    4- Based on mobile network we will get a pool (vodafone, Orange, etc..) I will send sms with first user in my list till his 5 sms Quota run out which I will preset every 24 hour in database using MySQL Scheduled feature [We will find socket connection Id of the sender with mobile number xxx from onlineUsers Table]
    5- Create item in a queue with OTP, SMS body(which will be fixed), and sender mobile number
    6- Queue will be configured to host item in the queue by maximum 10 min, and then it will be released if no verification call done
    7 - send socket Event to the mobile application to send sms on behave of the user
    
    8- check with socket sent from mobile if the sms sent correctly or not if it was sent, fine, if not then I will drop the user socket to keep availble users to send sms from provider pool.
    
  * **Verify OTP with Mobile**
  This API will verify OTP sent to a specified mobile number with 10 min after sending the sms from our system
    #### API scenario:
    
    1- Get the Mobile number Which received the sms, and the OTP sent
    2- find item in The queue with Mobile number (receiver) and OTP number 
    3- If found, we would delete this item from the queue.
    4- Issue Token for (sms sender [delivery]) 
    5- send a response with a verification message to API consumer
    6 If we did not the item in the queue then maybe item expired or consumer used **resend sms API**
    
     * **~~Resend SMS~~**
  ~~This API will be used if the sms did not be delivered or expired on the queue~~
    #### ~~API scenario:~~
    
    ~~1- Get mobile numbe fom request body
    2- Validte the mobile is really a mobile number or not based on [E.164](https://en.wikipedia.org/wiki/E.164) standard
    3- Generate OTP and sms body
    4- Based on mobile network we will get a pool (vodafone, Orange, etc..) (to get sender mobile number but randomly because I will send sms with the first user in my pool list which may has an issue in his mobile and that may restrict the operations and I will keep in mind the till the 5 sms Quota which I will preset every 24 hour in database using MySQL Scheduled feature) [We will find socket connection Id of the sender with mobile number xxx from onlineUsers Table]
    5- find and edit the item in the queue which has the OTP n the SMS body(which will be fixed), receiver mobile number, and update sender mobile number
    6- Queue will be configured to host item in the queue by maximum 10 min, and then it will be released if no verification call done
    7 - send socket Event to the mobile application to send sms on behave of the user~~
    
## Notes
1- This system will use redis as a scheduled queue system
2- SocketIO for sockets and maybe later AWS websocket from API Gateway Service
3- A senstive permission for the mobile APP which allow us to send SMS on behave of the user

## Technically What will happen as a user story [payment system]:

briefly, This system is created to register our potential customers and check their Quota of sms they will use for OTP service. and manage the payment. This system will integrate with **Send SMS system** to call the mentioned two APIs Above

### Use Case:
  - Customer wants to Recharge his balance to send OTP.
  - Customer wants to send OTP so; we will check his balance first and then send the sms if it is enough balance.
  - payment will be through checkoutjs.

#### Technically:
  - Create APIs for user auth/login/register/profile
  - Create API to send OTP 
     * Check user's balance if available then send OTP (by calling send OTP api in `OTP system`).
     * Create API to verify the OTP.