{"id":42979883,"url":"https://github.com/chinxcode/primetrade-taskmanager","last_synced_at":"2026-01-31T01:43:22.052Z","repository":{"id":325174779,"uuid":"1100126573","full_name":"chinxcode/primetrade-taskmanager","owner":"chinxcode","description":null,"archived":false,"fork":false,"pushed_at":"2025-11-19T22:36:09.000Z","size":81,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-20T00:19:59.520Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://primetrade-taskmanager-ui.vercel.app","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/chinxcode.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-19T21:51:27.000Z","updated_at":"2025-11-19T22:36:12.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/chinxcode/primetrade-taskmanager","commit_stats":null,"previous_names":["chinxcode/primetrade-taskmanager"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/chinxcode/primetrade-taskmanager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinxcode%2Fprimetrade-taskmanager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinxcode%2Fprimetrade-taskmanager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinxcode%2Fprimetrade-taskmanager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinxcode%2Fprimetrade-taskmanager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chinxcode","download_url":"https://codeload.github.com/chinxcode/primetrade-taskmanager/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinxcode%2Fprimetrade-taskmanager/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28926413,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-30T22:32:35.345Z","status":"ssl_error","status_checked_at":"2026-01-30T22:32:31.927Z","response_time":66,"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":[],"created_at":"2026-01-31T01:43:21.567Z","updated_at":"2026-01-31T01:43:22.043Z","avatar_url":"https://github.com/chinxcode.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Task Manager - Frontend Developer Intern Assignment\n\nA full-stack web application with authentication, user profile management, and task CRUD operations. Built with **Next.js**, **Tailwind CSS**, and **Node.js/Express** with **MongoDB**.\n\n## 🎯 Features Implemented\n\n### ✅ Frontend (Next.js + Tailwind CSS)\n\n-   **Authentication Pages**: Login \u0026 Registration with client-side validation\n-   **Protected Routes**: Dashboard accessible only to authenticated users\n-   **Responsive Design**: Black \u0026 white theme, no rounded corners, mobile-first approach\n-   **Dashboard**: Overview with statistics and quick actions\n-   **Task Management**: Full CRUD operations with search, filter, and sort\n-   **Profile Management**: View and update user profile, change password\n-   **Real-time Feedback**: Error handling, loading states, success messages\n\n### ✅ Backend (Node.js + Express + MongoDB)\n\n-   **JWT Authentication**: Secure token-based authentication with refresh tokens\n-   **Password Hashing**: bcrypt for secure password storage\n-   **User APIs**: Register, login, logout, profile fetch/update, password change\n-   **Task APIs**: CRUD operations with filtering, searching, and sorting\n-   **Error Handling**: Centralized error handling with custom error classes\n-   **Validation**: Server-side validation for all inputs\n-   **Security**: CORS configuration, secure cookies, token validation middleware\n\n### 🔒 Security Features\n\n-   Password hashing with bcrypt (10 rounds)\n-   JWT access tokens (1 day expiry)\n-   JWT refresh tokens (10 days expiry)\n-   Protected API endpoints with authentication middleware\n-   Input validation on both client and server\n-   Secure HTTP-only cookies\n-   CORS configuration\n\n## 🚀 Setup Instructions\n\n### Prerequisites\n\n-   Node.js (v18 or higher)\n-   MongoDB (local or cloud)\n-   npm or yarn\n\n### Backend Setup\n\n1. **Navigate to backend directory:**\n\n    ```bash\n    cd backend\n    ```\n\n2. **Install dependencies:**\n\n    ```bash\n    npm install\n    ```\n\n3. **Create environment file:**\n\n    ```bash\n    cp .env.example .env\n    ```\n\n4. **Configure environment variables in `.env`:**\n\n    ```env\n    PORT=8000\n    CORS_ORIGIN=http://localhost:3000\n\n    ACCESS_TOKEN_SECRET=your-super-secret-access-token-key\n    ACCESS_TOKEN_EXPIRY=1d\n\n    REFRESH_TOKEN_SECRET=your-super-secret-refresh-token-key\n    REFRESH_TOKEN_EXPIRY=10d\n\n    MONGODB_URL=mongodb://localhost:27017/primetrade-taskmanager\n    ```\n\n5. **Start MongoDB** (if running locally):\n\n    ```bash\n    mongod\n    ```\n\n6. **Run the development server:**\n\n    ```bash\n    npm run dev\n    ```\n\n    Backend will run on `http://localhost:8000`\n\n### Quick Start (Both Servers)\n\nOpen terminal window in root projest directory and run:\n\n```bash\nnpm run install-all\n```\n\n```bash\nnpm run dev\n```\n\nVisit `http://localhost:3000` in your browser.\n\n## 📚 API Documentation\n\n### Base URL\n\n```\nhttp://localhost:8000/api/v1\n```\n\n### Authentication Endpoints\n\n#### Register User\n\n```http\nPOST /users/register\nContent-Type: application/json\n\n{\n  \"fullName\": \"John Doe\",\n  \"username\": \"johndoe\",\n  \"email\": \"john@example.com\",\n  \"password\": \"password123\"\n}\n\nResponse: 201 Created\n{\n  \"statusCode\": 200,\n  \"data\": {\n    \"_id\": \"...\",\n    \"fullName\": \"John Doe\",\n    \"username\": \"johndoe\",\n    \"email\": \"john@example.com\",\n    \"avatar\": \"...\",\n    \"createdAt\": \"...\"\n  },\n  \"message\": \"User created successfully!\",\n  \"success\": true\n}\n```\n\n#### Login\n\n```http\nPOST /users/login\nContent-Type: application/json\n\n{\n  \"username\": \"johndoe\",\n  \"password\": \"password123\"\n}\n\nResponse: 200 OK\n{\n  \"statusCode\": 200,\n  \"data\": {\n    \"user\": { ... },\n    \"accessToken\": \"...\",\n    \"refreshToken\": \"...\"\n  },\n  \"message\": \"User logged in successfully\",\n  \"success\": true\n}\n```\n\n#### Get Current User\n\n```http\nGET /users/profile\nAuthorization: Bearer \u003caccessToken\u003e\n\nResponse: 200 OK\n{\n  \"statusCode\": 200,\n  \"data\": {\n    \"_id\": \"...\",\n    \"fullName\": \"John Doe\",\n    \"username\": \"johndoe\",\n    \"email\": \"john@example.com\",\n    ...\n  },\n  \"message\": \"User fetched successfully\",\n  \"success\": true\n}\n```\n\n#### Update Profile\n\n```http\nPATCH /users/profile\nAuthorization: Bearer \u003caccessToken\u003e\nContent-Type: application/json\n\n{\n  \"fullName\": \"John Updated\",\n  \"email\": \"newemail@example.com\"\n}\n\nResponse: 200 OK\n```\n\n#### Change Password\n\n```http\nPOST /users/change-password\nAuthorization: Bearer \u003caccessToken\u003e\nContent-Type: application/json\n\n{\n  \"oldPassword\": \"password123\",\n  \"newPassword\": \"newpassword123\"\n}\n\nResponse: 200 OK\n```\n\n#### Logout\n\n```http\nPOST /users/logout\nAuthorization: Bearer \u003caccessToken\u003e\n\nResponse: 200 OK\n```\n\n### Task Endpoints\n\n#### Create Task\n\n```http\nPOST /tasks\nAuthorization: Bearer \u003caccessToken\u003e\nContent-Type: application/json\n\n{\n  \"title\": \"Complete project\",\n  \"description\": \"Finish the frontend developer assignment\",\n  \"status\": \"pending\",\n  \"priority\": \"high\",\n  \"dueDate\": \"2025-11-25\"\n}\n\nResponse: 201 Created\n```\n\n#### Get All Tasks (with filters)\n\n```http\nGET /tasks?status=pending\u0026priority=high\u0026search=project\u0026sortBy=createdAt\u0026order=desc\nAuthorization: Bearer \u003caccessToken\u003e\n\nResponse: 200 OK\n{\n  \"statusCode\": 200,\n  \"data\": [\n    {\n      \"_id\": \"...\",\n      \"title\": \"Complete project\",\n      \"description\": \"...\",\n      \"status\": \"pending\",\n      \"priority\": \"high\",\n      \"dueDate\": \"2025-11-25\",\n      \"owner\": \"...\",\n      \"createdAt\": \"...\",\n      \"updatedAt\": \"...\"\n    }\n  ],\n  \"message\": \"Tasks fetched successfully\",\n  \"success\": true\n}\n```\n\nQuery Parameters:\n\n-   `status`: pending | in-progress | completed\n-   `priority`: low | medium | high\n-   `search`: Search in title and description\n-   `sortBy`: createdAt | title | priority | dueDate\n-   `order`: asc | desc\n\n#### Get Task by ID\n\n```http\nGET /tasks/:id\nAuthorization: Bearer \u003caccessToken\u003e\n\nResponse: 200 OK\n```\n\n#### Update Task\n\n```http\nPATCH /tasks/:id\nAuthorization: Bearer \u003caccessToken\u003e\nContent-Type: application/json\n\n{\n  \"title\": \"Updated title\",\n  \"status\": \"completed\"\n}\n\nResponse: 200 OK\n```\n\n#### Delete Task\n\n```http\nDELETE /tasks/:id\nAuthorization: Bearer \u003caccessToken\u003e\n\nResponse: 200 OK\n```\n\n#### Get Task Statistics\n\n```http\nGET /tasks/stats\nAuthorization: Bearer \u003caccessToken\u003e\n\nResponse: 200 OK\n{\n  \"statusCode\": 200,\n  \"data\": {\n    \"total\": 10,\n    \"pending\": 3,\n    \"in-progress\": 5,\n    \"completed\": 2\n  },\n  \"message\": \"Task statistics fetched successfully\",\n  \"success\": true\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchinxcode%2Fprimetrade-taskmanager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchinxcode%2Fprimetrade-taskmanager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchinxcode%2Fprimetrade-taskmanager/lists"}