{"id":28496273,"url":"https://github.com/larissadantier/server-tasks","last_synced_at":"2026-04-07T09:32:08.003Z","repository":{"id":296926060,"uuid":"995043150","full_name":"larissadantier/server-tasks","owner":"larissadantier","description":"Practice concepts with CRUD of Tasks","archived":false,"fork":false,"pushed_at":"2025-06-08T00:28:45.000Z","size":45,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-02T20:41:46.407Z","etag":null,"topics":["biome","csv","csv-stringifier","docker","fastify","node","postgresql"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/larissadantier.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":"2025-06-02T22:04:09.000Z","updated_at":"2025-06-08T00:32:00.000Z","dependencies_parsed_at":"2025-06-03T11:53:01.325Z","dependency_job_id":"487c04a9-127c-45ec-b5fe-9549615cc06d","html_url":"https://github.com/larissadantier/server-tasks","commit_stats":null,"previous_names":["larissadantier/server-tasks"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/larissadantier/server-tasks","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/larissadantier%2Fserver-tasks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/larissadantier%2Fserver-tasks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/larissadantier%2Fserver-tasks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/larissadantier%2Fserver-tasks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/larissadantier","download_url":"https://codeload.github.com/larissadantier/server-tasks/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/larissadantier%2Fserver-tasks/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31508019,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T03:10:19.677Z","status":"ssl_error","status_checked_at":"2026-04-07T03:10:13.982Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["biome","csv","csv-stringifier","docker","fastify","node","postgresql"],"created_at":"2025-06-08T12:07:05.072Z","updated_at":"2026-04-07T09:32:07.986Z","avatar_url":"https://github.com/larissadantier.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"#-tech-stack\"\u003eTech Stack\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n  \u003ca href=\"#-task-manager-api\"\u003eTask Manager API\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n  \u003ca href=\"#-license\"\u003eLicense\u003c/a\u003e\n\u003c/p\u003e\n\n## 📝 Task Manager API\n\nA simple RESTful API for managing tasks (CRUD + bulk import via CSV).\n\n## 💾 Tech Stack\n\n- [Node.js](https://nodejs.org/en)  \n- [Fastify](https://fastify.dev)\n- [Postgresql](https://www.postgresql.org)\n- [Docker](https://www.docker.com)\n- File handling for CSV import  \n\n## 📌 Features\n\n- Create a task  \n- List all tasks (with optional search)  \n- Update a task by `id`  \n- Delete a task by `id`  \n- Mark/unmark a task as completed  \n- Import tasks in bulk using a CSV file  \n\n## 📦 Task Structure\n\nEach task has the following properties:\n\n| Field         | Type          | Description                                                  |\n|---------------|---------------|--------------------------------------------------------------|\n| `id`          | string        | Unique identifier for the task                               |\n| `title`       | string        | Task title                                                   |\n| `description` | string        | Detailed task description                                    |\n| `completed_at`| datetime/null | Timestamp when the task was completed (initially `null`)     |\n| `created_at`  | datetime      | Timestamp when the task was created                          |\n| `updated_at`  | datetime      | Timestamp when the task was last updated                     |\n\n## 🚀 API Endpoints\n\n### `POST /tasks`\n\nCreate a new task.\n\n**Request Body:**\n\n```json\n{\n  \"title\": \"Task Title\",\n  \"description\": \"Task Description\"\n}\n```\n\n**Behavior:**\n- `id`, `created_at`, and `updated_at` are auto-generated.  \n- `completed_at` is initially set to `null`.\n\n### `GET /tasks`\n\nList all tasks. Supports optional filtering by `title` and/or `description`.\n\n**Query Params (optional):**\n\n```\n?title=example\u0026description=details\n```\n\n### `PUT /tasks/:id`\n\nUpdate a task's `title` and/or `description`.\n\n**Request Body:**\n\n```json\n{\n  \"title\": \"Updated Title\",\n  \"description\": \"Updated Description\"\n}\n```\n\n**Rules:**\n- You can update either `title`, `description`, or both.  \n- `updated_at` is updated on change.  \n- Must validate the task exists before updating.\n\n### `DELETE /tasks/:id`\n\nDelete a task by `id`.\n\n**Rules:**\n- Validate task existence before deletion.\n\n### `PATCH /tasks/:id/complete`\n\nToggle a task’s completion status.\n\n**Behavior:**\n- If `completed_at` is `null`, set it to the current timestamp.  \n- If `completed_at` has a value, reset it to `null`.\n\n### `GET /tasks/export-csv`\n\nBulk import tasks from a CSV file.\n\n**CSV Format:**\n\n```\nid,title,description\n1,Task 1,Description for Task 1\n2,Task 2,Description for Task 2\n...\n```\n\n**Behavior:**\n- All imported tasks follow the same creation rules as `POST /tasks`.\n\n## 🛠️ Setup \u0026 Run\n\n```bash\n# Clone the repository\n\ngit clone https://github.com/larissadantier/server-tasks.git\n\n# Install all packages\n\n- Npm\nnpm install\n\n- Yarn\nyarn install\n\n- Pnpm\npnpm install\n\nAfter all this, you're ready to run the project, just enter the command:\n\n- Docker\npnpm docker:up\n\n- Npm\nnpm run dev\n\n- Yarn\nyarn dev\n\n- Pnpm\npnpm dev\n\n- Bun\nbun dev\n\nAll done! Now your application will run 😄\n\n```\n\n## 🧪 Testing (Optional)\n\nYou can use tools like [Postman](https://www.postman.com), [Insomnia](https://insomnia.rest) or [Yaak](https://yaak.app) to test each route.\n\n## 📝 License\n\nThis project is under the MIT license. See the [LICENSE](LICENSE) file for more details.\n\n## 👀 Autor\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://app.rocketseat.com.br/me/larissadantier\"\u003e\n   \u003cimg align=\"center\" style=\"border-radius: 100%;\" src=\"https://avatars3.githubusercontent.com/u/61429963?s=400\u0026u=0182f2fa598437842398e2f08f5dc6622df0b432\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\u003cbr/\u003e\n\u003cp align=\"center\"\u003eDeveloped por Larissa Dantier 🚀 \u003c/p\u003e \n\u003cp align=\"center\"\u003eContact us 👏 \u003c/p\u003e\n\u003cdiv align=\"center\"\u003e\n\u003ca href=\"https://www.linkedin.com/in/larissadantier/\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/linkedin-%230077B5.svg?\u0026style=for-the-badge\u0026logo=linkedin\u0026logoColor=white\" /\u003e\n  \u003c/a\u003e\u0026nbsp;\u0026nbsp;\n \u003ca href=\"https://www.instagram.com/larissa.dantier/\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/instagram-%23E4405F.svg?\u0026style=for-the-badge\u0026logo=instagram\u0026logoColor=white\" /\u003e        \n  \u003c/a\u003e\u0026nbsp;\u0026nbsp;\n \u003ca href=\"mailto:larissa_dantier@hotmail.com\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Microsoft_Outlook-0078D4?style=for-the-badge\u0026logo=microsoft-outlook\u0026logoColor=white\" /\u003e        \n  \u003c/a\u003e\u0026nbsp;\u0026nbsp; \n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flarissadantier%2Fserver-tasks","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flarissadantier%2Fserver-tasks","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flarissadantier%2Fserver-tasks/lists"}