{"id":18256993,"url":"https://github.com/mediacomem/comem-webserv","last_synced_at":"2025-06-19T16:33:34.637Z","repository":{"id":73832452,"uuid":"79108036","full_name":"MediaComem/comem-webserv","owner":"MediaComem","description":"COMEM+ Web Services course","archived":false,"fork":false,"pushed_at":"2019-09-17T09:20:01.000Z","size":693,"stargazers_count":5,"open_issues_count":0,"forks_count":2,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-04-08T22:32:38.323Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"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/MediaComem.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}},"created_at":"2017-01-16T10:33:13.000Z","updated_at":"2019-01-31T16:07:55.000Z","dependencies_parsed_at":"2023-08-01T16:00:41.831Z","dependency_job_id":null,"html_url":"https://github.com/MediaComem/comem-webserv","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/MediaComem/comem-webserv","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MediaComem%2Fcomem-webserv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MediaComem%2Fcomem-webserv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MediaComem%2Fcomem-webserv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MediaComem%2Fcomem-webserv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MediaComem","download_url":"https://codeload.github.com/MediaComem/comem-webserv/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MediaComem%2Fcomem-webserv/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260786645,"owners_count":23062967,"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","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":[],"created_at":"2024-11-05T10:24:25.481Z","updated_at":"2025-06-19T16:33:29.628Z","avatar_url":"https://github.com/MediaComem.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# COMEM+ Web Services course\n\nThe goal of this course is to teach the generic concept of **web service**,\nfocusing on **REST**ful APIs as one way to expose such a service.\nYou will:\n\n* Learn the **core principles** of the REST architectural style.\n* Learn how to **implement** a RESTful API in JavaScript.\n* Learn how to **manage** your source code on a collaborative platform.\n* Learn how to **deploy** your RESTful API on a cloud application platform.\n\nThis course is a [COMEM+][comem] [web development course][comem-webdev] taught at [HEIG-VD][heig].\n\n\u003c!-- START doctoc generated TOC please keep comment here to allow auto update --\u003e\n\u003c!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --\u003e\n\n\n- [Plan](#plan)\n- [What you will need](#what-you-will-need)\n- [Useful links](#useful-links)\n- [Evaluation](#evaluation)\n  - [Delivery](#delivery)\n\n\u003c!-- END doctoc generated TOC please keep comment here to allow auto update --\u003e\n\n\n\n## Plan\n\n* [Introduction](https://mediacomem.github.io/comem-webdev-docs/2018-2019/subjects/webserv-course?home=MediaComem%2Fcomem-webserv%23readme)\n\n* Tooling\n  * [Command line](https://mediacomem.github.io/comem-webdev-docs/2018-2019/subjects/cli?home=MediaComem%2Fcomem-webserv%23readme)\n  * [Version control with Git](https://mediacomem.github.io/comem-webdev-docs/2018-2019/subjects/git?home=MediaComem%2Fcomem-webserv%23readme)\n  * [Git branching](https://mediacomem.github.io/comem-webdev-docs/2018-2019/subjects/git-branching?home=MediaComem%2Fcomem-webserv%23readme)\n  * [Collaborating with Git](https://mediacomem.github.io/comem-webdev-docs/2018-2019/subjects/git-collaborating?home=MediaComem%2Fcomem-webserv%23readme)\n\n* Basics\n  * [JavaScript](https://mediacomem.github.io/comem-webdev-docs/2018-2019/subjects/js?home=MediaComem%2Fcomem-webserv%23readme)\n  * [Node.js](https://mediacomem.github.io/comem-webdev-docs/2018-2019/subjects/node?home=MediaComem%2Fcomem-webserv%23readme) JavaScript runtime\n  * [npm](https://mediacomem.github.io/comem-webdev-docs/2018-2019/subjects/npm?home=MediaComem%2Fcomem-webserv%23readme) Node.js package manager\n  * [RESTful APIs](https://mediacomem.github.io/comem-webdev-docs/2018-2019/subjects/rest?home=MediaComem%2Fcomem-webserv%23readme)\n\n* Creating a web service\n  * [Express](https://mediacomem.github.io/comem-webdev-docs/2018-2019/subjects/express?home=MediaComem%2Fcomem-webserv%23readme) web framework\n  * [MongoDB](https://mediacomem.github.io/comem-webdev-docs/2018-2019/subjects/mongodb?home=MediaComem%2Fcomem-webserv%23readme) document-oriented database\n  * [Mongoose](https://mediacomem.github.io/comem-webdev-docs/2018-2019/subjects/mongoose?home=MediaComem%2Fcomem-webserv%23readme) Object-Document Mapper\n\n* Deploying your web service\n  * [Heroku](https://mediacomem.github.io/comem-webdev-docs/2018-2019/subjects/heroku?home=MediaComem%2Fcomem-webserv%23readme) cloud application platform\n\n* Enriching your web service\n  * [RESTful API conventions](https://mediacomem.github.io/comem-webdev-docs/2018-2019/subjects/rest-conventions?home=MediaComem%2Fcomem-webserv%23readme)\n  * [Express best practices](https://mediacomem.github.io/comem-webdev-docs/2018-2019/subjects/express-best-practices?home=MediaComem%2Fcomem-webserv%23readme)\n  * [Utilizing Mongoose](https://mediacomem.github.io/comem-webdev-docs/2018-2019/subjects/express-mongoose?home=MediaComem%2Fcomem-webserv%23readme) in Express (filtering, pagination, aggregation)\n  * [Express Authentication](https://mediacomem.github.io/comem-webdev-docs/2018-2019/subjects/express-auth?home=MediaComem%2Fcomem-webserv%23readme)\n  * [RESTful API documentation](https://mediacomem.github.io/comem-webdev-docs/2018-2019/subjects/apidoc?home=MediaComem%2Fcomem-webserv%23readme) with apiDoc\n\n\n\n## What you will need\n\n* A Unix CLI (Git Bash is included with Git on Windows)\n* [Git][git-downloads]\n* A free [GitHub][github] account\n* [Google Chrome][chrome] (recommended, any browser with developer tools will do)\n* [Node.js][node] 6+\n* [Postman][postman] (recommended, any tool that makes raw HTTP requests will do)\n* [MongoDB][mongodb]\n* A free [Heroku][heroku] account\n* The [Heroku CLI][heroku-cli]\n\n\n\n## Useful links\n\n* [Architecture \u0026 source code management diagrams][diagrams]\n* [Demonstration REST API implemented with Express][demo-api] ([documentation][demo-api-doc])\n* [Command line cheatsheet][cli-cheatsheet]\n* [Git cheatsheet][git-cheatsheet]\n* [Project suggestions](PROJECTS.md)\n\n\n\n## Evaluation\n\n**Web Service**\n\nYour REST API must be developed with the Express framework and use a MongoDB database.\nIt must provide (at least):\n\n* The API must provide **user management**:\n  * New users must be able to **register**.\n  * Existing users must be able to **authenticate** (to allow users to log in).\n* The API must provide at least **2 other types** of resources:\n  * Both types must be linked together (e.g. aggregation or composition).\n  * At least one of the types must be linked to users.\n  * The API must provide minimal CRUD operations to manage and use those types in a mobile application.\n* The API must use the knowledge learned during the course:\n  * At least one resource must be a **paginated list**.\n  * At least one resource must be a **list with optional filters**.\n  * At least one resource must provide **aggregated data** from other resources using a [MongoDB aggregation pipeline][mongodb-aggregation]\n    (e.g. the number of items created by a user).\n  * The API must be developed as a backend to a mobile application\n    using at least 2 [**mobile hardware features**][cordova-plugins], for example:\n    * At least one resource must be **geolocated**.\n    * At least one resource must have one or multiple **pictures**\n      (it is sufficient to store a picture URL or URLs in the database).\n  * Sensitive operations must be protected by requiring valid **authentication**.\n    * Authentication must be provided in the form of a [JWT token][jwt] or an equivalent mechanism.\n\n**Infrastructure**\n\n* The source code of your REST API must be in a repository on GitHub.\n* Your REST API must be deployed on Heroku.\n\n**Documentation**\n\n* Your REST API must be documented.\n\n**Quality of the implementation**\n\n* You must follow REST best practices:\n  * Your REST resources must use appropriate HTTP methods, headers and status codes.\n  * Your REST resources must have a consistent URL hierarchy and/or naming structure.\n* Your asynchronous code must be correct.\n* Your Express routes must handle asynchronous operation errors.\n* You must avoid excessive code duplication (e.g. using Express middleware).\n* Your API must have basic validations on user input (e.g. using Mongoose validations).\n* Your API must validate the existence of linked resources (e.g. when creating an item linked to a user).\n\n\n\n### Delivery\n\nSend an e-mail *no later than __November 5th 2018__* to Simon Oulevay with:\n\n* The list of group members.\n* The link to your source code repository on GitHub.\n* The to your deployed REST API on Heroku.\n\n\n\n[chrome]: https://www.google.com/chrome/\n[cli-cheatsheet]: https://github.com/MediaComem/comem-webdev/blob/master/CLI-CHEATSHEET.md\n[comem]: http://www.heig-vd.ch/comem\n[comem-webdev]: https://github.com/MediaComem/comem-webdev\n[cordova-plugins]: https://cordova.apache.org/docs/en/latest/#plugin-apis\n[demo-api]: https://github.com/MediaComem/comem-webdev-express-rest-demo\n[demo-api-doc]: https://mediacomem.github.io/comem-webdev-express-rest-demo/\n[diagrams]: diagrams.pdf\n[git-cheatsheet]: https://github.com/MediaComem/comem-webdev/blob/master/GIT-CHEATSHEET.md\n[git-downloads]: https://git-scm.com/downloads\n[github]: https://github.com\n[heroku]: https://www.heroku.com/home\n[heroku-cli]: https://devcenter.heroku.com/articles/heroku-cli\n[heig]: http://www.heig-vd.ch\n[jwt]: https://jwt.io/\n[mongodb]: https://www.mongodb.com\n[mongodb-aggregation]: https://docs.mongodb.com/manual/core/aggregation-pipeline/\n[node]: https://nodejs.org/\n[postman]: https://www.getpostman.com\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmediacomem%2Fcomem-webserv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmediacomem%2Fcomem-webserv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmediacomem%2Fcomem-webserv/lists"}