Appearance
Projects
Projects group tasks together and manage members with project-level roles.
Model
Project
├── name, description, status
├── organizationId? (optional)
├── teamId? (optional)
├── members (with roles)
└── tasks (full task lifecycle)API Endpoints
| Method | Path | Description |
|---|---|---|
GET | /api/projects | List user's projects |
POST | /api/projects | Create project |
GET | /api/projects/:projectId | Get project details |
PATCH | /api/projects/:projectId | Update project |
DELETE | /api/projects/:projectId | Delete project |
GET | /api/projects/:projectId/members | List members |
POST | /api/projects/:projectId/members | Add member |
DELETE | /api/projects/:projectId/members/:userId | Remove member |
Frontend Routes
| Route | View | Description |
|---|---|---|
/projects | ProjectsView | List all user projects |
/projects/:projectId | ProjectDetailView | Project overview |
/projects/:projectId/tasks | ProjectTasksView | Project task list |
/projects/:projectId/tasks/:taskId | ProjectTaskDetailView | Task detail |
/projects/:projectId/settings | ProjectSettingsView | Project settings |
Frontend Store
typescript
const store = useProjectsStore()
const { projects, currentProject } = storeToRefs(store)
await store.fetchProjects()
await store.fetchProject(projectId)
await store.createProject({ name, description, organizationId, teamId })
await store.updateProject(projectId, { name, description })
// Members
await store.addMember(projectId, userId, role)
await store.removeMember(projectId, userId)Key Implementation Details
- Project permissions control task CRUD operations
- Member roles at the project level override org/team roles for project-scoped actions
- Tasks are always project-scoped (required
projectIdwith cascade delete)