# Assignment - API DOC This doc is a part of assignment for the Intership Opportunity from Truexam ## Stack and Technology - `server`, `Express JS` will be used with `NodeJS` as the environment - `database`, `MongoDB` as database and `Mongoose` for schema and performing operations in `NodeJS` - `libraries` - `express` for ExpressJS - `mongoose` for database related matter - `express-sessions` for session handling - `connect-mongo` for storing Express Sessions details - `bcrypt` for hashing the passwords - `multer` for handling files - `aws-sdk` for handling AWS S3 Bucket Uploads - `validator` for validations ## API lists ### - POST `/user/create` - To create new users <strong>Schema</strong> `application/json` ```javascript { name: __USER_NAME__, email: __USER_EMAIL__, contact: __PHONE_NUMBER__, track:__TRACK_TYPE__, password: __PASSWORD__, dor : __DATE_OF_REGISTRATION__ } ``` <strong>Special Points</strong> - Mandatory fields are `name`, `email`, `contact`, `track`, `password` - `dor` will be automatically created from server side - This is a public endpoint - `track` will be sanitised based on `Beginner`, `Intermidiate` and `Advanced` , Except that it will throw error - `email` must be valid (validation will be done through library `validator`) - `contact` must be a 10-digit valid number which can be made more validated by sending OTP or using a 3rd party library - Mandatory fields, if left empty or undefined will throw error <strong>Status Codes (Success and Error)</strong> `application/json` - `201` - User Created Successfully ```javascript { data : { _id : __MONGO_OBJECT_ID, //user_id name : __NAME__, email : __EMAIL__, track : __TRACK_TYPE__, password: __HASHED_SALTED_PASSWORD__, dor: __DATE_OF_REGISTRATION__ } } ``` - `406` - Not accepted due to improper data recieved - Data undefined ```javascript { error : '__FIELD__ undefined', errorOccured : '__FIELD__' } ``` - Data inccorect format (`track`, `email`, `contact`) ```javascript { erorr: '__FIELD__ incorrect format', errorOccured : '__FIELD__' } ``` - `500` - Database unresponsive ```javascript { error: 'database unresponsive', errorOccured: 'database', errorMessage: __DETAILED_REPORT_FROM_MONGOOSE__ } ``` ### - POST `/instructor/create` - To create instructors account <strong>Schema</strong> `application/json` ```javascript { name: __INSTRUCTOR_NAME__, email: __INSTRUCTOR_EMAIL__, contact: __PHONE_NUMBER__, password: __PASSWORD__, doj : __DATE_OF_JOINING__ } ``` <strong>Special Points</strong> - Mandatory fields are `name`, `email`, `contact`, `password` - `doj` will be automatically created from server side - This is a public endpoint - `email` must be valid (validation will be done through library `validator`) - `contact` must be a 10-digit valid number which can be made more validated by sending OTP or using a 3rd party library - Mandatory fields, if left empty or undefined will throw error <strong>Status Codes (Success and Error)</strong> `application/json` - `201` - User Created Successfully ```javascript { data : { _id : __MONGO_OBJECT_ID, //instructor_id name : __NAME__, email : __EMAIL__, password: __HASHED_SALTED_PASSWORD__, doj: __DATE_OF_REGISTRATION__ } } ``` - - `406` - Not accepted due to improper data recieved - Data undefined (Mandatory fields not sent) ```javascript { error : '__FIELD__ undefined', errorOccured : '__FIELD__' } ``` - Data inccorect format (`email`, `contact`) ```javascript { erorr: '__FIELD__ incorrect format', errorOccured : '__FIELD__' } ``` - `500` - Database unresponsive ```javascript { error: 'database unresponsive', errorOccured: 'database', errorMessage: __DETAILED_REPORT_FROM_MONGOOSE__ } ``` ### - GET `/:role/check/:email` - To check whether the email is already registered or not (instructor/user) <strong>Speacial Points</strong> - As per schema and design, one user can be registered with one email - `:role` is a param - whether the person is `user` or `instructor`. Accordingly that database will be searched - `:email` is a param where the email has to be passed for checking - This is an internal endpoint to be used in frontend for verifcation while email is entered <strong>Status Codes (Success and Error)</strong> `application/json` - `200` - OK - email not found - registration can be done ```javascript { canRegister : true } ``` - `404` - Email Found - Registration cannot be allowed in that email ```javascript { canRegister : false } ``` - `500` - Database unresponsive ```javascript { error: 'database unresponsive', errorOccured: 'database', errorMessage: __DETAILED_REPORT_FROM_MONGOOSE__ } ``` ### - POST `/task/new` - To create a new task <strong>Schema</strong> `application/json` ```javascript { name: __TASK_NAME__, desc: __DESCRIPTION_OF_THE_TASK__, imgUrl: __IMG_URL__, assignedTo : [ __USER_EMAIL_1__, __USER_EMAIL_2__, __USER_EMAIL_3__, ... ], deadline : __DATE__, assingedBy : __INSTRUCTOR_ID__ } ``` <strong>Special Points</strong> - All fields are mandatory - `desc` is a small description of the task that has to be created - `imgUrl` is a image url for the task provided by `POST /task/upload` - `assignedTo` is am array of users to whom the instructor assigned the task - `assignedBy` is the instructor's ID for future reference - `deadline` is the date for submission of the task - All data will be sanitized and validated - <strong>IMPORTANT</strong> : before using this endpoint please upload the images through the endpoint `POST /task/upload` which will return the image Urls to be used here <strong>Status Codes (Success and Error)</strong> `application/json` - `201` - User Created Successfully ```javascript { data : { _id : __TASK_ID, //instructor_id name : __NAME__, desc: __DESCRIPTION_OF_THE_TASK__, imgUrl: __IMG_URL__, assignedTo : [ __USER_EMAIL_1__, __USER_EMAIL_2__, __USER_EMAIL_3__, ... ], deadline : __DATE__, assingedBy : __INSTRUCTOR_ID__ } } ``` - - `406` - Not accepted due to improper data recieved - Data undefined (Mandatory fields not sent) ```javascript { error : '__FIELD__ undefined', errorOccured : '__FIELD__' } ``` - Data inccorect format ```javascript { erorr: '__FIELD__ incorrect format', errorOccured : '__FIELD__' } ``` - `500` - Database unresponsive ```javascript { error: 'database unresponsive', errorOccured: 'database', errorMessage: __DETAILED_REPORT_FROM_MONGOOSE__ } ``` ### - POST `/task/upload` - To store the image in AWS S3 Storage <strong>Special Points</strong> `multipart/form-data` - To be stored in AWS S3 bucket - For this the image will be passed as `formdata` - The return will be an array of url/s if successfull in upload - the key must be named `image` as shown below <strong>JS Code</strong> ```javascript= var fd= new formData() fd.append('image', __THE_UPLOADED_IMAGE__) fetch(__URL__, { method: 'POST', body: fd, }) ``` <strong>Status Codes (Success and Error)</strong> `application/json` - `201` : All image upload successfull ```javascript { status: true, data:{ ... location : __IMG_URL__ //aws public link for the image ... } } ``` - `500` - Error in upload ```javascript { status: false, error:{ __AWS_DETAILED_ERROR_REPORT__ } } ``` ### - GET `/task/user/:userid` - To get the tasks assigned to the student <strong>Special Points</strong> - `:userid` is the student's userID <strong>Status Codes (Success and Error)</strong> `application/json` - `200` : Task details recieved ```javascript { data:[ { _id : __TASK_ID__, name : __TASK_NAME__, desc : __TASK_DESCRIPTION__, imgUrl : __IMG_URL__, deadline: __DEADLINE__, assignedBy : __INSTRUCTOR_NAME__, isEvaluated: __TRUE/FALSE__, grade : __GRADE_FROM_0_TO_5__, }, ... ] } ``` - `404` - Student/User not found ```javascript { error: `user not found`, errorOccured: 'user' } ``` - `500` - Database unresponsive ```javascript { error: 'database unresponsive', errorOccured: 'database', errorMessage: __DETAILED_REPORT_FROM_MONGOOSE__ } ``` ### - POST `/task/submit` - To submit the task <strong>Schema</strong> `application/json` ```javascript { userId: __USER_ID__, taskId: __TASK_ID__, imgSubmitted : __IMG_URL__, } ``` <strong>Special Points</strong> - `imgSubmitted` is a image url for the task provided by `POST /task/upload` - <strong>IMPORTANT</strong> : before using this endpoint please upload the images through the endpoint `POST /task/upload` which will return the image url to be used here - `userid` and `taskid` should be valid <strong>Status Codes (Success and Error)</strong> `application/json` - `201` - Task submitted successfully ```javascript { submited : true, userId: __USER_ID__, taskId: __TASK_ID__, imgSubmitted : __IMG_URL__ } ``` - `404` - User/Task not found - User not found ```javascript { error : 'user not found', errorOccured : 'user' } ``` - Task not found ```javascript { error : 'task not found', errorOccured : 'task' } ``` - `500` - Error in upload ```javascript { status: false, error:{ __AWS_DETAILED_ERROR_REPORT__ } } ``` ### - GET `/task/instructor/:taskid` - To get the submitted task of all or particular student <strong>Special Points</strong> - `:taskid` is the taskId - This endpoint accepts queries - `?userid=__USER_ID__` - To get the submitted task of a particular user example : `/task/instructor/60d813cd4f976942bc67bd0c?userid=60d813cd4f976942bc67bd0d` - `if left empty or no query is passed` - To get the all the submitted tasks of those who have submitted example : `/task/instructor/60d813cd4f976942bc67bd0c` <strong>Status Codes (Success and Error)</strong> `application/json` - `200` : Data recieved - if query `?userid=` is passed ```javascript { data: { _id: __SUBMISSION_ID__, taskid : __TASKID__, userid : __USER_ID__, imgSubmitted : __IMG_URL__, isEvaluated : __TRUE/FALSE__, grade : __GRADE_FROM_0_TO_5__, } } ``` - if no query is passed ```javascript { data: [ { _id: __SUBMISSION_ID__, taskid : __TASKID__, userid : __USER_ID__, imgSubmitted : __IMG_URL__, isEvaluated : __TRUE/FALSE__, grade : __GRADE_FROM_0_TO_5__, }, ... ] } ``` - `404` - Not found - if `?userid=` query used ```javascript { error : `User/task not found` errorOccured : `user/task` } ```` - if `no query` is used ```javascript { error : 'task not found', errorOccured : 'task' } ``` - `500` - Database unresponsive ```javascript { error: 'database unresponsive', errorOccured: 'database', errorMessage: __DETAILED_REPORT_FROM_MONGOOSE__ } ``` ### - POST `/task/evaluate` - To evaluate the task submitted <strong>Schema</strong> `application/json` ```javascript { submissionId : __SUBMISSION_ID__ grade : __FROM_1_to_5__, } ``` <strong>Special Points</strong> - `submissionId` must be valid - `grade` must be between 1 and 5. default is 0 if not corrected <strong>Status Codes (Success and Error)</strong> `application/json` - `201` - Evaluated successfully ```javascript { isEvaluated : true } ``` - `409` - Already evaluated ```javascript { data: { _id: __SUBMISSION_ID__, taskid : __TASKID__, userid : __USER_ID__, imgSubmitted : __IMG_URL__, isEvaluated : __TRUE/FALSE__, grade : __GRADE_FROM_0_TO_5__, } } ``` - `404` - submission not found ```javascript { error : 'submission not found', errorOccured: 'submission' } ``` - `500` - Database unresponsive ```javascript { error: 'database unresponsive', errorOccured: 'database', errorMessage: __DETAILED_REPORT_FROM_MONGOOSE__ } ``` ### - GET `/task/result/:userid` - To get the results of the submitted and evaluated tasks <strong>Special Points</strong> - `userid` must be valid - This endpoint accepts queries - `?taskid=__TASK_ID__` : to get a particular details of a submitted task example : `/task/result/60d813cd4f976942bc67bd0e?taskid=60d813164f976942bc67bcfe` - no query - get all the details of submitted task example: `/task/result/60d813cd4f976942bc67bd0e` <strong>Special Points</strong> `application/json` - `200` - Data recieved - If there is no query ```javascript { data: [ { _id : __SUBMISSION_ID__, taskId : __TASK_ID__, userId : __USER_ID__, isEvaluated : __TRUE/FALSE__, grade : __1_to_5__, }, ... ] } ```` - If there is `?taskid=` query ```javascript { data: { _id : __SUBMISSION_ID__, taskId : __TASK_ID__, userId : __USER_ID__, isEvaluated : __TRUE/FALSE__, grade : __1_to_5__, } } ``` - `404` - Not found - if there is no query, no user with the userID found ```javascript { error : 'user not found', errorOccured : 'user' } ``` - if there is `?taskid=` query ```javascript { error : 'user/task not found', errorOccured : 'user/task' } ``` - `500` - Database unresponsive ```javascript { error: 'database unresponsive', errorOccured: 'database', errorMessage: __DETAILED_REPORT_FROM_MONGOOSE__ } ``` ## Models ### - User Model ```json { name :{ type : String, required : true, }, email :{ type : String, required : true, unique : true }, contact :{ type : String, required : true, }, track :{ type : String, required : true, enum : ['Beginner', 'Intermediate', 'Advanced'] }, password :{ type : String, required : true }, dor :{ type : Date, default : new Date() } } ``` ### - Instructor Model ```json { name :{ type : String, required : true, }, email :{ type : String, required : true, unique : true }, contact :{ type : String, required : true, }, password :{ type : String, required : true }, doj :{ type : Date, default : new Date() } } ``` ### - Task Model ```json { name :{ type : String, required : true }, desc :{ type : String }, imgUrl :{ type : Url, required : true }, assignedTo :{ type : [String], required : true }, deadline :{ type: Date, required : true, }, assignedBy :{ type : ObjectId, required : true } } ``` ### - Submission Model ```json { userId :{ type : ObjectId, required : true, }, taskId :{ type : ObjectId, required : true }, imgSubmitted :{ type : Url, required : true }, isEvaluated :{ type : Boolean, default : false, }, grade :{ type : Number, default : 0, enum : [1,2,3,4,5] } } ``` _______________________________ Name : Pratyay Saha Resume : [https://resume.smll.in](https://resume.smll.in)