{"id":19820045,"url":"https://github.com/freelancer/comp9322","last_synced_at":"2026-06-15T07:32:38.137Z","repository":{"id":90761721,"uuid":"121589274","full_name":"freelancer/COMP9322","owner":"freelancer","description":null,"archived":false,"fork":false,"pushed_at":"2018-03-12T11:37:02.000Z","size":90,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-02-28T20:22:26.021Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/freelancer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2018-02-15T03:57:00.000Z","updated_at":"2018-05-16T19:49:56.000Z","dependencies_parsed_at":null,"dependency_job_id":"d8e647b3-e31b-4467-af9e-d7bc841dbe11","html_url":"https://github.com/freelancer/COMP9322","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/freelancer/COMP9322","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freelancer%2FCOMP9322","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freelancer%2FCOMP9322/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freelancer%2FCOMP9322/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freelancer%2FCOMP9322/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/freelancer","download_url":"https://codeload.github.com/freelancer/COMP9322/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freelancer%2FCOMP9322/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34353193,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-15T02:00:07.085Z","response_time":63,"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":[],"created_at":"2024-11-12T10:21:12.336Z","updated_at":"2026-06-15T07:32:38.093Z","avatar_url":"https://github.com/freelancer.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Lab exercises for COMP9322\n\nThe overall goal of the following exercises is to demonstrate *service oriented architecture* or *microservices architecture*.\nThe general idea of this software design pattern is that each service performs a fairly indepedent role and multiple\nservices together offer one or more user facing functionality. The interaction between these services are usually via one\nor a mix of *HTTP* or *Remote Procedure Call*(RPCs). For the labs here, we will be using HTTP.\n\nOur sample web application that we will use to demonstrate the above is a *Today I learned* application which is a\nplatform to write and share short posts about what users learn everyday. It will be composed of two independent\nservices. We will only focus on building the HTTP APIs for each service and consider designing any Web User Interface as out of scope for these exercises. The interaction\nwith these services will be via HTTP clients.\n\n## [Lab 1](./lab-1)\n\n**Goal:** Create a HTTP API backend for handling user management (**auth** service)\n\n- Handle user signup\n- Handler user login (token based authentication)\n\n## [Lab 2](./lab-2)\n\n**Goal:** Create a HTTP API backend for the __Today I Learned__ application\n\n- Create new posts\n- View posts\n\n## [Lab 3](./lab-3)\n\n**Goal:** Implement basic analytics functionality for the __Today I learned__ application\n\n- API endpoint to return top tags\n\n\n## General notes\n\n## Programming language\n\nThe programming language used for the exercises is *Python 3* and we will be using [pipenv](https://github.com/pypa/pipenv)\nfor using and managing third party packages.\n\n### API Documentation\n\nWe will be using [Open API specification](https://swagger.io/docs/specification/about/) file for documenting our HTTP\nAPI. The documentation will be added to the source as comments in the following form:\n\n```python\n\"\"\" New User Signup\n    ---\n    parameters:\n      - in: \"body\"\n        name: \"body\"\n        description: \"Signup a new User\"\n        required: true\n        schema:\n          $ref: \"#/definitions/UserSignupRequest\"\n    responses:\n      400:\n        description: \"Invalid input\"\n    definitions:\n      UserSignupRequest:\n        type: \"object\"\n        properties:\n          username:\n            type: \"string\"\n          first_name:\n            type: \"string\"\n          last_name:\n            type: \"string\"\n          email:\n            type: \"string\"\n          password:\n            type: \"string\"\n    \"\"\"\n    ...\n\n```\n\nUsing [flasgger](https://github.com/rochacbruno/flasgger) when we run the service, the documentation will automatically become available to us at a desginated URL.\n\n## HTTP Clients\n\nWe can make HTTP API requests to the service using a HTTP client like [postman](https://www.getpostman.com/), [curl](https://zaiste.net/introduction_to_curl/) or a more friendlier command line client, [httpie](https://httpie.org/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffreelancer%2Fcomp9322","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffreelancer%2Fcomp9322","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffreelancer%2Fcomp9322/lists"}