From f4476efa2b8214746b03cfec5a0c6cdc7f638fb9 Mon Sep 17 00:00:00 2001 From: quarnstric Date: Wed, 8 Nov 2023 14:40:42 +0530 Subject: [PATCH] updated README.md --- README.md | 118 +++++- api-docs | 994 +++++++++++++++++++++++++++++++++++++++++++++++ et --soft HEAD~1 | 143 ------- 3 files changed, 1111 insertions(+), 144 deletions(-) create mode 100644 api-docs delete mode 100644 et --soft HEAD~1 diff --git a/README.md b/README.md index 52c3d56..5439287 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Kitchen-Maestro-Server +# Kitchen-Maestro-Server# Kitchen-Maestro-Server Kitchen-Maestro is a server-side application built using Django that serves as a virtual recipe box. @@ -17,3 +17,119 @@ This README file provides an overview of the key features and functionalities of - **Uploading and Viewing Images**: Kitchen-Maestro supports image uploads, allowing users to attach pictures of their dishes to their recipes. ## APIs + +### USER + +- **POST**: `/api/user/create` + +- **GET**: `/api/user/me` + +- **PUT**: `/api/user/me` + +- **PATCH**: `/api/user/me` + +- **POST**: `/api/user/token` + +### RECIPE + +- **GET**: `/api/recipe/ingredients` + +- **PUT**: `/api/recipe/ingredients/{id}` + +- **PATCH**: `/api/recipe/ingredients/{id}` + +- **DELETE**: `/api/recipe/ingredients/{id}` + +- **GET**: `/api/recipe/recipes/` + +- **POST**: `/api/recipe/recipes/` + +- **GET**: `/api/recipe/recipes/{id}` + +- **PUT**: `/api/recipe/recipes/{id}` + +- **PATCH**: `/api/recipe/recipes/{id}` + +- **DELETE**: `/api/recipe/recipes/{id}` + +- **POST**: `/api/recipe/recipes/{id}/upload-image` + +- **GET**: `/api/recipe/tags` + +- **PUT**: `/api/recipe/tags/{id}` + +- **PATCH**: `/api/recipe/tags/{id}` + +- **DELETE**: `/api/recipe/tags/{id}` + +### SWAGGER DOCS + +- **Endpoint**: `/api/docs` + +### ADMIN + +- **Endpoint**: `/admin/` + +**NOTE**: For more detail about API endpoint follow [api-docs](api-docs). + +## Installation Guide + +**NOTE**: The `main` branch of the repository is ahead by some commits and is set for deployment. For testing purposes, use the `delete-commit-branch`. + +- Make sure you have the following tools and software installed: + - Docker + - Docker-Compose + - Python (for Django) + - Postgres database + +1. Clone the repository to your local machine (`delete-commit-branch`): + + ```bash + git clone https://github.com/nishu-saini/Kitchen-Maestro-Server/tree/delete-commit-branch + ``` + +2. Open terminal in project root directory and create a python virtual environment + + ```bash + python -m venv venv + source venv/bin/activate # On Windows, use: venv\Scripts\activate + ``` + +3. Install the project dependencies: + + ```bash + pip install -r requirements.txt + ``` + +4. Build docker image: + + - Note: This will also create the necessary migrations needed to create the database in Django. + + ```bash + docker-compose build + ``` + +5. Create a superuser for the Django admin: + + - Note: Remember email and password for admin route, otherwise need to make new admin user to access admin route. + + ```bash + docker-compose run --rm app sh -c 'python manage.py createsuperuser' + ``` + +6. To run unit tests, use the following command: + + ```bash + docker-compose run --rm app sh -c 'python manage.py test' + ``` + +7. Start development server + + ```bash + docker-compose up + ``` + +## Usage + +- Access the API at http://localhost:8000/api/docs. +- Access the Django admin at http://localhost:8000/admin/ to manage recipes and users. diff --git a/api-docs b/api-docs new file mode 100644 index 0000000..aa4b66d --- /dev/null +++ b/api-docs @@ -0,0 +1,994 @@ +openapi: 3.0.3 +info: + title: "" + version: 0.0.0 +paths: + /api/recipe/ingredients/: + get: + operationId: recipe_ingredients_list + description: Manage ingredients in the database + parameters: + - in: query + name: assigned_only + schema: + type: integer + enum: + - 0 + - 1 + description: Filter by items assigned to recipes + tags: + - recipe + security: + - tokenAuth: [] + responses: + "200": + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/Ingredient" + description: "" + /api/recipe/ingredients/{id}/: + put: + operationId: recipe_ingredients_update + description: Manage ingredients in the database + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this ingredient. + required: true + tags: + - recipe + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/IngredientRequest" + application/x-www-form-urlencoded: + schema: + $ref: "#/components/schemas/IngredientRequest" + multipart/form-data: + schema: + $ref: "#/components/schemas/IngredientRequest" + required: true + security: + - tokenAuth: [] + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/Ingredient" + description: "" + patch: + operationId: recipe_ingredients_partial_update + description: Manage ingredients in the database + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this ingredient. + required: true + tags: + - recipe + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/PatchedIngredientRequest" + application/x-www-form-urlencoded: + schema: + $ref: "#/components/schemas/PatchedIngredientRequest" + multipart/form-data: + schema: + $ref: "#/components/schemas/PatchedIngredientRequest" + security: + - tokenAuth: [] + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/Ingredient" + description: "" + delete: + operationId: recipe_ingredients_destroy + description: Manage ingredients in the database + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this ingredient. + required: true + tags: + - recipe + security: + - tokenAuth: [] + responses: + "204": + description: No response body + /api/recipe/recipes/: + get: + operationId: recipe_recipes_list + description: View for manage recipe APIs + parameters: + - in: query + name: ingredients + schema: + type: string + description: Comma seperated list of ingredient IDs to filter + - in: query + name: tags + schema: + type: string + description: Comma seperated list of IDs to filter + tags: + - recipe + security: + - tokenAuth: [] + responses: + "200": + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/Recipe" + description: "" + post: + operationId: recipe_recipes_create + description: View for manage recipe APIs + tags: + - recipe + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/RecipeDetailRequest" + application/x-www-form-urlencoded: + schema: + $ref: "#/components/schemas/RecipeDetailRequest" + multipart/form-data: + schema: + $ref: "#/components/schemas/RecipeDetailRequest" + required: true + security: + - tokenAuth: [] + responses: + "201": + content: + application/json: + schema: + $ref: "#/components/schemas/RecipeDetail" + description: "" + /api/recipe/recipes/{id}/: + get: + operationId: recipe_recipes_retrieve + description: View for manage recipe APIs + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this recipe. + required: true + tags: + - recipe + security: + - tokenAuth: [] + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/RecipeDetail" + description: "" + put: + operationId: recipe_recipes_update + description: View for manage recipe APIs + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this recipe. + required: true + tags: + - recipe + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/RecipeDetailRequest" + application/x-www-form-urlencoded: + schema: + $ref: "#/components/schemas/RecipeDetailRequest" + multipart/form-data: + schema: + $ref: "#/components/schemas/RecipeDetailRequest" + required: true + security: + - tokenAuth: [] + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/RecipeDetail" + description: "" + patch: + operationId: recipe_recipes_partial_update + description: View for manage recipe APIs + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this recipe. + required: true + tags: + - recipe + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/PatchedRecipeDetailRequest" + application/x-www-form-urlencoded: + schema: + $ref: "#/components/schemas/PatchedRecipeDetailRequest" + multipart/form-data: + schema: + $ref: "#/components/schemas/PatchedRecipeDetailRequest" + security: + - tokenAuth: [] + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/RecipeDetail" + description: "" + delete: + operationId: recipe_recipes_destroy + description: View for manage recipe APIs + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this recipe. + required: true + tags: + - recipe + security: + - tokenAuth: [] + responses: + "204": + description: No response body + /api/recipe/recipes/{id}/upload-image/: + post: + operationId: recipe_recipes_upload_image_create + description: Upload an image to recipe + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this recipe. + required: true + tags: + - recipe + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/RecipeImageRequest" + application/x-www-form-urlencoded: + schema: + $ref: "#/components/schemas/RecipeImageRequest" + multipart/form-data: + schema: + $ref: "#/components/schemas/RecipeImageRequest" + required: true + security: + - tokenAuth: [] + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/RecipeImage" + description: "" + /api/recipe/tags/: + get: + operationId: recipe_tags_list + description: Manage tags in the database + parameters: + - in: query + name: assigned_only + schema: + type: integer + enum: + - 0 + - 1 + description: Filter by items assigned to recipes + tags: + - recipe + security: + - tokenAuth: [] + responses: + "200": + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/Tag" + description: "" + /api/recipe/tags/{id}/: + put: + operationId: recipe_tags_update + description: Manage tags in the database + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this tag. + required: true + tags: + - recipe + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/TagRequest" + application/x-www-form-urlencoded: + schema: + $ref: "#/components/schemas/TagRequest" + multipart/form-data: + schema: + $ref: "#/components/schemas/TagRequest" + required: true + security: + - tokenAuth: [] + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/Tag" + description: "" + patch: + operationId: recipe_tags_partial_update + description: Manage tags in the database + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this tag. + required: true + tags: + - recipe + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/PatchedTagRequest" + application/x-www-form-urlencoded: + schema: + $ref: "#/components/schemas/PatchedTagRequest" + multipart/form-data: + schema: + $ref: "#/components/schemas/PatchedTagRequest" + security: + - tokenAuth: [] + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/Tag" + description: "" + delete: + operationId: recipe_tags_destroy + description: Manage tags in the database + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this tag. + required: true + tags: + - recipe + security: + - tokenAuth: [] + responses: + "204": + description: No response body + /api/schema/: + get: + operationId: schema_retrieve + description: |- + OpenApi3 schema for this API. Format can be selected via content negotiation. + + - YAML: application/vnd.oai.openapi + - JSON: application/vnd.oai.openapi+json + parameters: + - in: query + name: format + schema: + type: string + enum: + - json + - yaml + - in: query + name: lang + schema: + type: string + enum: + - af + - ar + - ar-dz + - ast + - az + - be + - bg + - bn + - br + - bs + - ca + - cs + - cy + - da + - de + - dsb + - el + - en + - en-au + - en-gb + - eo + - es + - es-ar + - es-co + - es-mx + - es-ni + - es-ve + - et + - eu + - fa + - fi + - fr + - fy + - ga + - gd + - gl + - he + - hi + - hr + - hsb + - hu + - hy + - ia + - id + - ig + - io + - is + - it + - ja + - ka + - kab + - kk + - km + - kn + - ko + - ky + - lb + - lt + - lv + - mk + - ml + - mn + - mr + - my + - nb + - ne + - nl + - nn + - os + - pa + - pl + - pt + - pt-br + - ro + - ru + - sk + - sl + - sq + - sr + - sr-latn + - sv + - sw + - ta + - te + - tg + - th + - tk + - tr + - tt + - udm + - uk + - ur + - uz + - vi + - zh-hans + - zh-hant + tags: + - schema + security: + - cookieAuth: [] + - basicAuth: [] + - {} + responses: + "200": + content: + application/vnd.oai.openapi: + schema: + type: object + additionalProperties: {} + application/yaml: + schema: + type: object + additionalProperties: {} + application/vnd.oai.openapi+json: + schema: + type: object + additionalProperties: {} + application/json: + schema: + type: object + additionalProperties: {} + description: "" + /api/user/create/: + post: + operationId: user_create_create + description: Create a new user in the system + tags: + - user + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UserRequest" + application/x-www-form-urlencoded: + schema: + $ref: "#/components/schemas/UserRequest" + multipart/form-data: + schema: + $ref: "#/components/schemas/UserRequest" + required: true + security: + - cookieAuth: [] + - basicAuth: [] + - {} + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/User" + description: "" + /api/user/me/: + get: + operationId: user_me_retrieve + description: Manage the authentication user + tags: + - user + security: + - tokenAuth: [] + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/User" + description: "" + put: + operationId: user_me_update + description: Manage the authentication user + tags: + - user + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UserRequest" + application/x-www-form-urlencoded: + schema: + $ref: "#/components/schemas/UserRequest" + multipart/form-data: + schema: + $ref: "#/components/schemas/UserRequest" + required: true + security: + - tokenAuth: [] + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/User" + description: "" + patch: + operationId: user_me_partial_update + description: Manage the authentication user + tags: + - user + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/PatchedUserRequest" + application/x-www-form-urlencoded: + schema: + $ref: "#/components/schemas/PatchedUserRequest" + multipart/form-data: + schema: + $ref: "#/components/schemas/PatchedUserRequest" + security: + - tokenAuth: [] + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/User" + description: "" + /api/user/token/: + post: + operationId: user_token_create + description: Create a new auth token for user + tags: + - user + requestBody: + content: + application/x-www-form-urlencoded: + schema: + $ref: "#/components/schemas/AuthTokenRequest" + multipart/form-data: + schema: + $ref: "#/components/schemas/AuthTokenRequest" + application/json: + schema: + $ref: "#/components/schemas/AuthTokenRequest" + required: true + security: + - cookieAuth: [] + - basicAuth: [] + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/AuthToken" + description: "" +components: + schemas: + AuthToken: + type: object + description: Serializer for the user auth token + properties: + email: + type: string + format: email + password: + type: string + required: + - email + - password + AuthTokenRequest: + type: object + description: Serializer for the user auth token + properties: + email: + type: string + format: email + password: + type: string + required: + - email + - password + Ingredient: + type: object + description: Serializer for ingredients + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + required: + - id + - name + IngredientRequest: + type: object + description: Serializer for ingredients + properties: + name: + type: string + maxLength: 255 + required: + - name + PatchedIngredientRequest: + type: object + description: Serializer for ingredients + properties: + name: + type: string + maxLength: 255 + PatchedRecipeDetailRequest: + type: object + description: Serializer for recipe detail view + properties: + title: + type: string + maxLength: 255 + time_minutes: + type: integer + maximum: 2147483647 + minimum: -2147483648 + price: + type: string + format: decimal + pattern: ^\d{0,3}(\.\d{0,2})?$ + link: + type: string + maxLength: 255 + tags: + type: array + items: + $ref: "#/components/schemas/TagRequest" + ingredients: + type: array + items: + $ref: "#/components/schemas/IngredientRequest" + description: + type: string + image: + type: string + format: binary + nullable: true + PatchedTagRequest: + type: object + description: Serializer for tags + properties: + name: + type: string + maxLength: 255 + PatchedUserRequest: + type: object + description: Serializer for the user object + properties: + email: + type: string + format: email + maxLength: 255 + password: + type: string + writeOnly: true + maxLength: 128 + minLength: 5 + name: + type: string + maxLength: 255 + Recipe: + type: object + description: Serializer for recipes + properties: + id: + type: integer + readOnly: true + title: + type: string + maxLength: 255 + time_minutes: + type: integer + maximum: 2147483647 + minimum: -2147483648 + price: + type: string + format: decimal + pattern: ^\d{0,3}(\.\d{0,2})?$ + link: + type: string + maxLength: 255 + tags: + type: array + items: + $ref: "#/components/schemas/Tag" + ingredients: + type: array + items: + $ref: "#/components/schemas/Ingredient" + required: + - id + - price + - time_minutes + - title + RecipeDetail: + type: object + description: Serializer for recipe detail view + properties: + id: + type: integer + readOnly: true + title: + type: string + maxLength: 255 + time_minutes: + type: integer + maximum: 2147483647 + minimum: -2147483648 + price: + type: string + format: decimal + pattern: ^\d{0,3}(\.\d{0,2})?$ + link: + type: string + maxLength: 255 + tags: + type: array + items: + $ref: "#/components/schemas/Tag" + ingredients: + type: array + items: + $ref: "#/components/schemas/Ingredient" + description: + type: string + image: + type: string + format: uri + nullable: true + required: + - id + - price + - time_minutes + - title + RecipeDetailRequest: + type: object + description: Serializer for recipe detail view + properties: + title: + type: string + maxLength: 255 + time_minutes: + type: integer + maximum: 2147483647 + minimum: -2147483648 + price: + type: string + format: decimal + pattern: ^\d{0,3}(\.\d{0,2})?$ + link: + type: string + maxLength: 255 + tags: + type: array + items: + $ref: "#/components/schemas/TagRequest" + ingredients: + type: array + items: + $ref: "#/components/schemas/IngredientRequest" + description: + type: string + image: + type: string + format: binary + nullable: true + required: + - price + - time_minutes + - title + RecipeImage: + type: object + description: Serializer for uploading images to recipes + properties: + id: + type: integer + readOnly: true + image: + type: string + format: uri + nullable: true + required: + - id + - image + RecipeImageRequest: + type: object + description: Serializer for uploading images to recipes + properties: + image: + type: string + format: binary + nullable: true + required: + - image + Tag: + type: object + description: Serializer for tags + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + required: + - id + - name + TagRequest: + type: object + description: Serializer for tags + properties: + name: + type: string + maxLength: 255 + required: + - name + User: + type: object + description: Serializer for the user object + properties: + email: + type: string + format: email + maxLength: 255 + name: + type: string + maxLength: 255 + required: + - email + - name + UserRequest: + type: object + description: Serializer for the user object + properties: + email: + type: string + format: email + maxLength: 255 + password: + type: string + writeOnly: true + maxLength: 128 + minLength: 5 + name: + type: string + maxLength: 255 + required: + - email + - name + - password + securitySchemes: + basicAuth: + type: http + scheme: basic + cookieAuth: + type: apiKey + in: cookie + name: Session + tokenAuth: + type: apiKey + in: header + name: Authorization + description: Token-based authentication with required prefix "Token" diff --git a/et --soft HEAD~1 b/et --soft HEAD~1 deleted file mode 100644 index 1753d09..0000000 --- a/et --soft HEAD~1 +++ /dev/null @@ -1,143 +0,0 @@ -commit f2eb24bc1e41ce8e1e36fa5c971f636a1b194bb5 (HEAD -> main) -Author: quarnstric -Date: Tue Nov 7 17:35:12 2023 +0530 - - established deployable environment - -commit 72d16d36f697f289b3d8e74d2f4053ec6e4a6579 -Author: quarnstric -Date: Tue Nov 7 02:22:02 2023 +0530 - - implemented filter feature to Recipe API - -commit 92ced384d1e52a7e6232611e8b01350c92c04020 -Author: quarnstric -Date: Tue Nov 7 00:24:26 2023 +0530 - - created image upload feature to Recipe API - -commit bf208a7b70b7b0915ed8f30f91c607762a2f77e2 -Author: quarnstric -Date: Mon Nov 6 22:38:19 2023 +0530 - - added ingredient functionalities to recipe API - -commit d085d776f80088b4ce9d42b26f4639052eac0d90 -Author: quarnstric -Date: Sun Nov 5 17:52:12 2023 +0530 - - implemented functionality of Tag API - -commit e216fa407a56e6b35eebe1abcb4c97ad5a7c7432 -Author: quarnstric -Date: Sat Nov 4 17:57:32 2023 +0530 - - implemented Tag model and Endpoints - -commit 1d8ac7bedbccbc3f1023125f2b3def5237fec654 -Author: quarnstric -Date: Sat Nov 4 16:31:05 2023 +0530 - - added recipe API and its functionalities - -commit cf288d27d43f2d81f237e9f203378a7294e94b86 -Author: quarnstric -Date: Sat Nov 4 00:55:50 2023 +0530 - - functionality added to user app - -commit c03d5704cac44d49b522c0fe7da09bc8f805cd9c -Author: quarnstric -Date: Fri Nov 3 22:35:25 2023 +0530 - - Implemented authentication class to user view - -commit c819cb965a19fe20cf0e359e444b584036c4f12f -Author: quarnstric -Date: Fri Nov 3 18:19:41 2023 +0530 - - added user app and created testcases for it - -commit 91301a342ecd13a765e8ae39a67ec4c49506f777 -Author: quarnstric -Date: Thu Nov 2 23:14:18 2023 +0530 - - defined swagger documentation - -commit 750d0d7d0e8a4916b67c8f6f0244d0c5449427c9 -Author: quarnstric -Date: Thu Nov 2 22:13:15 2023 +0530 - - modified user page for admin - -commit 6133eadae9236023b6e228e67b6723722a0516aa -Author: quarnstric -Date: Thu Nov 2 18:17:55 2023 +0530 - - updated admin panel in django app - -commit 26606bee44a906a78755f3db1b6468e69e5cef8d -Author: quarnstric -Date: Thu Nov 2 17:30:55 2023 +0530 - - removed flake8 from github actions - -commit b9f46f21e49ba4d5f30515b7fad55b8cb9686464 -Author: quarnstric -Date: Thu Nov 2 17:13:19 2023 +0530 - - flake8 error fixed - -commit d0280d04d140ae6053fdff298fa13139e002d54e -Author: quarnstric -Date: Thu Nov 2 16:35:33 2023 +0530 - - implemented valid email and superuser functionality - -commit 8759f51bc4ccacda68415a6039f8378381709508 -Author: quarnstric -Date: Wed Nov 1 18:15:03 2023 +0530 - - created custom user model and user manager - -commit 444b345a3532c1c7b9dc56981942072631b7c304 -Author: quarnstric -Date: Tue Oct 31 12:07:53 2023 +0530 - - server error - -commit 077abd59c6e58601a7c56fbc1b2eba16c6298702 -Author: quarnstric -Date: Tue Oct 31 11:48:42 2023 +0530 - - handled database delayed error - -commit c45fc31085a5932d5d138809a8396215308db5c8 -Author: quarnstric -Date: Tue Oct 31 00:00:00 2023 +0530 - - postgresql databse implemented - -commit c5511730c94a1139be5c25c4a99a208ba1b80227 -Author: quarnstric -Date: Thu Oct 19 16:58:17 2023 +0530 - - error fixed in checks.yml - -commit 1d37509a5b7e5e15b0cdfe5c711cb9ddb87c51a4 -Author: quarnstric -Date: Thu Oct 19 16:54:05 2023 +0530 - - Added Github Actions - -commit 791a2c5627741b6617dbf55e9c76b64740d2fb31 -Author: quarnstric -Date: Tue Oct 17 19:12:07 2023 +0530 - - Project Intialized - -commit 347aa5999f8748a8bb4bd72a751e623e48d0c920 -Author: Nishu Saini <57725190+nishu-saini@users.noreply.github.com> -Date: Sun Oct 15 17:29:09 2023 +0530 - - Initial commit