{"id":21440994,"url":"https://github.com/jmcamposdev/integralprojectizv","last_synced_at":"2026-04-10T02:18:25.060Z","repository":{"id":226074937,"uuid":"751223264","full_name":"jmcamposdev/integralProjectIZV","owner":"jmcamposdev","description":"Zawee Web Application for managing an Institute with Teachers, Training Levels, Modules, Groups and Lessons","archived":false,"fork":false,"pushed_at":"2024-03-06T14:49:00.000Z","size":10169,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-09T03:03:18.214Z","etag":null,"topics":["api-rest","expressjs","jwt","jwt-token","mysql","nodejs","reactjs","reacttable","tailwindcss"],"latest_commit_sha":null,"homepage":"https://zawee.jmcampos.dev","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jmcamposdev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-02-01T07:10:31.000Z","updated_at":"2024-03-06T14:39:13.000Z","dependencies_parsed_at":null,"dependency_job_id":"042ecc63-a7af-4faf-964b-e9e0e151a13c","html_url":"https://github.com/jmcamposdev/integralProjectIZV","commit_stats":null,"previous_names":["jmcamposdev/integralprojectizv"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jmcamposdev/integralProjectIZV","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmcamposdev%2FintegralProjectIZV","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmcamposdev%2FintegralProjectIZV/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmcamposdev%2FintegralProjectIZV/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmcamposdev%2FintegralProjectIZV/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jmcamposdev","download_url":"https://codeload.github.com/jmcamposdev/integralProjectIZV/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmcamposdev%2FintegralProjectIZV/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279000775,"owners_count":26082911,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-09T02:00:07.460Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-rest","expressjs","jwt","jwt-token","mysql","nodejs","reactjs","reacttable","tailwindcss"],"created_at":"2024-11-23T01:19:48.725Z","updated_at":"2025-10-09T03:07:26.095Z","avatar_url":"https://github.com/jmcamposdev.png","language":"JavaScript","readme":"\n# Work inter-modules (Zawee)\n\n\u003cp align=\"center\"\u003e\n\n  \u003cimg src=\"https://github.com/jmcamposdev/integralProjectIZV/assets/108521775/692d20e0-24ec-4f20-a497-bb7d24b5ea30\" width=\"300px\" /\u003e\n\n  https://github.com/jmcamposdev/integralProjectIZV/assets/108521775/7b52f263-2408-49f0-9352-1c03699547da\n\n\u003c/p\u003e\n\n\n## Project Link 🌐\nAccess to the website here -\u003e [Zawee](https://zawee.jmcampos.dev)\n\n## Table of Contents\n* [General Info](#general-info)\n* [Technologies](#technologies)\n* [Setup](#setup)\n* [Project Structure](#project-structure)\n* [RESTful API](#restful-api)\n* [Key Features](#key-features)\n\n## General Info\nThe Inter-module Project was carried out during the last 2 months of class before the FCT.\n\nThe project consists of the **Lesson Assignment to Professors of the Department**. It will also implement roles and we will have 3 types\n* Administrator: Can perform any operation on the tables.\n* Registered User: Can consult all the data without making modifications.\n* Unregistered User: Can consult the group structure of the current course.\n\n### Entity Relationship Diagram\n![Integral Project IZV Diagram](https://github.com/jmcamposdev/integralProjectIZV/assets/108521775/d994cb94-a544-4aef-823d-b2aea052a847)\n\n## Technologies\n\nProject is created with:\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg width=\"441\" height=\"1\"\u003e\n      \u003cp\u003e\u003cstrong\u003eFRONTEND\u003c/strong\u003e\u003c/p\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg width=\"441\" height=\"1\"\u003e\n      \u003cp\u003e\u003cstrong\u003eBACKEND\u003c/strong\u003e\u003c/p\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg width=\"441\" height=\"1\"\u003e\n      \u003cp\u003e\u003cstrong\u003eTOOLS\u003c/strong\u003e\u003c/p\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg width=\"50\" src=\"https://user-images.githubusercontent.com/25181517/192158954-f88b5814-d510-4564-b285-dff7d6400dad.png\" alt=\"HTML\" title=\"HTML\"/\u003e\n      \u003cimg width=\"50\" src=\"https://user-images.githubusercontent.com/25181517/183898674-75a4a1b1-f960-4ea9-abcb-637170a00a75.png\" alt=\"CSS\" title=\"CSS\"/\u003e\n      \u003cimg width=\"50\" src=\"https://user-images.githubusercontent.com/25181517/202896760-337261ed-ee92-4979-84c4-d4b829c7355d.png\" alt=\"Tailwind CSS\" title=\"Tailwind CSS\"/\u003e\n      \u003cimg width=\"50\" src=\"https://user-images.githubusercontent.com/25181517/117447155-6a868a00-af3d-11eb-9cfe-245df15c9f3f.png\" alt=\"JavaScript\" title=\"JavaScript\"/\u003e\n      \u003cimg width=\"50\" src=\"https://user-images.githubusercontent.com/25181517/183897015-94a058a6-b86e-4e42-a37f-bf92061753e5.png\" alt=\"React\" title=\"React\"/\u003e\n      \u003cimg width=\"50\" src=\"https://github.com/marwin1991/profile-technology-icons/assets/62091613/b40892ef-efb8-4b0e-a6b5-d1cfc2f3fc35\" alt=\"Vite\" title=\"Vite\"/\u003e\n      \u003cimg width=\"50\" src=\"https://github.com/marwin1991/profile-technology-icons/assets/136815194/ecd443af-ebba-4af8-a46e-1bf64d863b5b\" alt=\"Babel\" title=\"Babel\"/\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg width=\"50\" src=\"https://user-images.githubusercontent.com/25181517/183568594-85e280a7-0d7e-4d1a-9028-c8c2209e073c.png\" alt=\"Node.js\" title=\"Node.js\"/\u003e\n      \u003cimg width=\"50\" src=\"https://user-images.githubusercontent.com/25181517/183859966-a3462d8d-1bc7-4880-b353-e2cbed900ed6.png\" alt=\"Express\" title=\"Express\"/\u003e\n      \u003cimg width=\"50\" src=\"https://user-images.githubusercontent.com/25181517/183896128-ec99105a-ec1a-4d85-b08b-1aa1620b2046.png\" alt=\"MySQL\" title=\"MySQL\"/\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg width=\"50\" src=\"https://user-images.githubusercontent.com/25181517/192107858-fe19f043-c502-4009-8c47-476fc89718ad.png\" alt=\"REST\" title=\"REST\"/\u003e\n      \u003cimg width=\"50\" src=\"https://user-images.githubusercontent.com/25181517/192108372-f71d70ac-7ae6-4c0d-8395-51d8870c2ef0.png\" alt=\"Git\" title=\"Git\"/\u003e\n      \u003cimg width=\"50\" src=\"https://user-images.githubusercontent.com/25181517/192108374-8da61ba1-99ec-41d7-80b8-fb2f7c0a4948.png\" alt=\"GitHub\" title=\"GitHub\"/\u003e\n      \u003cimg width=\"50\" src=\"https://user-images.githubusercontent.com/25181517/121401671-49102800-c959-11eb-9f6f-74d49a5e1774.png\" alt=\"npm\" title=\"npm\"/\u003e\n      \u003cimg width=\"50\" src=\"https://user-images.githubusercontent.com/25181517/192109061-e138ca71-337c-4019-8d42-4792fdaa7128.png\" alt=\"Postman\" title=\"Postman\"/\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Setup\n\n### Prerequisites\n1. Node.js and npm installed\n2. MySQL installed and configured\n\n### Steps to Start the Application\nTo clone and run this applicaion, you'll need [Git](https://git-scm.com/downloads) and [Node.js](https://nodejs.org/en/download) (which comes with [npm](https://www.npmjs.com/)) installed on you computer.\n\nNext you'll need to create the ```eduAssignment``` database created\n\n```\n# Clone this repository\n$ git clone https://github.com/jmcamposdev/integralProjectIZV.git\n\n# Go into the repository\n$ cd integralProjectIZV\n\n# Install dependencies on the Server and Client\n$ cd client \u0026\u0026 npm i\n$ cd ../server \u0026\u0026 npm i\n\n# Run the app\n$ npm run dev // On the Client and Server\n```\n\n## Project Structure\n\n```bash\nintegralProjectIZV/\n│\n├── client/\n│ ├── public/\n│ │ └── ... (React public files)\n│ ├── src/\n│ │ ├── components/\n│ │ │ └── ... (React components)\n│ │ ├── pages/\n│ │ │ └── ... (React pages)\n│ │ ├── App.js\n│ │ └── index.js\n│ │\n│ ├── .gitignore\n│ ├── package.json\n│ └── README.md\n│\n├── server/\n│ ├── controllers/\n│ │ └── ... (Node.js controllers)\n│ ├── models/\n│ │ └── ... (Database models)\n│ ├── routes/\n│ │ └── ... (Express routes)\n│ ├── index.js\n│ │\n│ ├── .gitignore\n│ ├── package.json\n│ └── README.md\n│\n├── .gitignore\n├── package.json\n├── README.md\n└── ...\n```\n\n## RESTful API\nWelcome to the Integral Project RESTful API. This API provides access to the management of all available resources.\n\n### Base URL \nThe API can be accessed through the following base URL:\n[https://api.zawee.jmcampos.dev](https://api.zawee.jmcampos.dev)\n\n### Authentication\n\nTo access certain resources, authentication is required. Be sure to include the `x-access-token` header with a valid token in the relevant requests.\n\n### Endpoints\n\n#### Auth \n- `POST /auth/signin`: Sign in a user. Returns a `JSON` object with the user's data and a token. Requires a `JSON` object with the user's data.\n\n#### User\n- `GET /users`: Get all users. Returns a `JSON` array of all users. `x-access-token` header required.\n- `GET /users/:id`: Get a user by ID. Returns a `JSON` object with the user's data. `x-access-token` header required.\n- `POST /users`: Create a new user. Returns a `JSON` object with the new user's data. Requires a `JSON` object with the user's data. `x-access-token` header required.\n- `PUT /users/:senecaUser`: Update a user by ID. Returns a `JSON` object with the updated user's data. Requires a `JSON` object with the user's data. `x-access-token` header required.\n- `DELETE /users/:id`: Delete a user by ID. Returns a `JSON` object with the deleted user's data. `x-access-token` header required.\n\n\n#### Professor\n- `GET /professors`: Get all professors. Returns a `JSON` array of all professors.\n- `GET /professors/:id`: Get a professor by ID. Returns a `JSON` object with the professor's data.\n- `GET /professors/:id/lessons`: Get all lessons assigned to a professor by ID. Returns a `JSON` array of all lessons. \n- `POST /professors`: Create a new professor. Returns a `JSON` object with the new professor's data. Requires a `JSON` object with the professor's data. `x-access-token` header required.\n- `PUT /professors/:id`: Update a professor by ID. Returns a `JSON` object with the updated professor's data. Requires a `JSON` object with the professor's data. `x-access-token` header required.\n- `DELETE /professors/:id`: Delete a professor by ID. Returns a `JSON` object with the deleted professor's data. `x-access-token` header required.\n\n#### Formation\n- `GET /formations`: Get all formations. Returns a `JSON` array of all formations.\n- `GET /formations/:id`: Get a formation by ID. Returns a `JSON` object with the formation's data.\n- `GET /formations/:id/groups`: Get all groups of a formation by ID. Returns a `JSON` array of all groups.\n- `GET /formations/:id/modules`: Get all modules of a formation by ID. Returns a `JSON` array of all modules.\n- `POST /formations`: Create a new formation. Returns a `JSON` object with the new formation's data. Requires a `JSON` object with the formation's data. `x-access-token` header required.\n- `PUT /formations/:id`: Update a formation by ID. Returns a `JSON` object with the updated formation's data. Requires a `JSON` object with the formation's data. `x-access-token` header required.\n- `DELETE /formations/:id`: Delete a formation by ID. Returns a `JSON` object with the deleted formation's data. `x-access-token` header required.\n\n#### Module\n- `GET /modules`: Get all modules. Returns a `JSON` array of all modules.\n- `GET /modules/:id`: Get a module by ID. Returns a `JSON` object with the module's data.\n- `GET /modules/:id/lessons`: Get all lessons of a module by ID.  Returns a `JSON` array of all lessons.\n- `POST /modules`: Create a new module. Returns a `JSON` object with the new module's data. Requires a `JSON` object with the module's data. `x-access-token` header required.\n- `PUT /modules/:id`: Update a module by ID. Returns a `JSON` object with the updated module's data. Requires a `JSON` object with the module's data. `x-access-token` header required.\n- `DELETE /modules/:id`: Delete a module by ID. Returns a `JSON` object with the deleted module's data. `x-access-token` header required.\n\n#### Group\n- `GET /groups`: Get all groups. Returns a `JSON` array of all groups.\n- `GET /groups/:id`: Get a group by ID. Returns a `JSON` object with the group's data.\n- `GET /groups/:id/lessons`: Get all lessons of a group by ID.  Returns a `JSON` array of all lessons.\n- `POST /groups`: Create a new group. Returns a `JSON` object with the new group's data. Requires a `JSON` object with the group's data. `x-access-token` header required.\n- `PUT /groups/:id`: Update a group by ID. Returns a `JSON` object with the updated group's data. Requires a `JSON` object with the group's data. `x-access-token` header required.\n- `DELETE /groups/:id`: Delete a group by ID. Returns a `JSON` object with the deleted group's data. `x-access-token` header required.\n\n#### Lesson\n- `GET /lessons`: Get all lessons. Returns a `JSON` array of all lessons.\n- `GET /lessons/:id`: Get a lesson by ID. Returns a `JSON` object with the lesson's data.\n- `GET /lessons-current-year`: Get all lessons of the current year e.g. 2024/2025\n- `POST /lessons`: Create a new lesson. Returns a `JSON` object with the new lesson's data. Requires a `JSON` object with the lesson's data. `x-access-token` header required.\n- `POST /lessons-generate`: Automatically generates as many lessons as possible with the available groups and modules by assigning the teacher to null.\n- `PUT /lessons/:id`: Update a lesson by ID. Returns a `JSON` object with the updated lesson's data. Requires a `JSON` object with the lesson's data. `x-access-token` header required.\n- `DELETE /lessons/:id`: Delete a lesson by ID. Returns a `JSON` object with the deleted lesson's data. `x-access-token` header required.\n\n### Example\n```bash\n# Request\nGET /professors/\n\n# Response\n[\n  {\n    \"id\": 1,\n    \"senecaUser\": \"josemariacampos\",\n    \"name\": \"José María\",\n    \"firstSurname\": \"Campos\",\n    \"lastSurname\": \"Trujillo\",\n    \"specialty\": \"FP\",\n  },\n  {\n    \"id\": 2,\n    \"senecaUser\": \"carloshernandez\",\n    \"name\": \"Carlos\",\n    \"firstSurname\": \"Hernández\",\n    \"lastSurname\": \"Palma\",\n    \"specialty\": \"Secundary\",\n  },\n]\n\n# Request\nPOST /professors/\nHeaders: x-access-token: \u003ctoken\u003e\n{\n  \"seneceUser\": \"davidluque\",\n  \"name\": \"David\",\n  \"firstSurname\": \"Luque\",\n  \"lastSurname\": \"Vegas\",\n  \"specialty\": \"FP\"\n}\n\n# Response - 201 Created\n{\n  \"id\": 3,\n  \"senecaUser\": \"davidluque\",\n  \"name\": \"David\",\n  \"firstSurname\": \"Luque\",\n  \"lastSurname\": \"Vegas\",\n  \"specialty\": \"FP\"\n}\n```\n\n## Key Features\n- Management of five tables: Professor, Formation, Module, Group, Lesson.\n- Administrators can perform any operation on the tables.\n- Registered users can view data without making modifications.\n- Unregistered users can view the structure of groups in the current school year.\n\n## Lesson Generation\n1. Enter data into the Professor, Formation, and Module tables.\n2. Register data in the Group table.\n3. Create lessons for the school year, leaving the professor_id field blank (null).\n\n## Important Considerations\n1. Multiple lessons can be created for a module, assigned to different professors.\n2. Create lessons to ensure no hours are left untaught in any module.\n\n## Interactive Lesson Assignment Web Page\n- Administrators can filter and assign professors to lessons.\n- Authenticated users can check the progress of lesson assignments.\n\n## License\nThis project is under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Authors\nCampos Trujillo, José María - [jmcamposdev](https://github.com/jmcamposdev)\n\nCarlos Hernandez Palma - [carloshpdev](https://github.com/carloshpdev)\n\nLuque Vegas, David - [Daviiid999](https://github.com/Daviiid999)\n\nCapdevila Rodríguez, Víctor - [vilacprd](https://github.com/vilacprd)\n\nRodríguez Jareño, Manuel - [Manabimassu](https://github.com/Manabimassu)\n\n## Acknowledgments\nWe appreciate the collaboration of IES Zaidín-Vergeles in this project.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjmcamposdev%2Fintegralprojectizv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjmcamposdev%2Fintegralprojectizv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjmcamposdev%2Fintegralprojectizv/lists"}