feat(project): add graphql resolvers
zhenyi committed
Added lib/project/graphql/resolvers.rs lib/project/graphql/resolvers.rs +68 −0 View lib/project/graphql/resolvers.rs
@@ -0,0 +1,68 @@
1use async_graphql::{Context, Object, Result as GqlResult};
2use db::conn::sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
3
4use crate::graphql::types::{parse_id, ProjectGql, ProjectMemberGql};
5use crate::service::ProjectService;
6
7pub struct QueryRoot;
8
9#[Object]
10impl QueryRoot {
11 async fn project(&self, ctx: &Context<'_>, id: String) -> GqlResult<Option<ProjectGql>> {
12 let svc = ctx.data::<ProjectService>()?;
13 let id = parse_id(&id)?;
14 let reader = svc.db.reader();
15 let row = db::project::project::Entity::find_by_id(id)
16 .one(&reader)
17 .await
18 .map_err(|e| async_graphql::Error::new(format!("db: {e}")))?;
19 Ok(row.map(ProjectGql::from))
20 }
21
22 async fn projects_in_space(
23 &self,
24 ctx: &Context<'_>,
25 space_id: String,
26 ) -> GqlResult<Vec<ProjectGql>> {
27 let svc = ctx.data::<ProjectService>()?;
28 let space_id = parse_id(&space_id)?;
29 let reader = svc.db.reader();
30 let rows = db::project::project::Entity::find()
31 .filter(db::project::project::Column::SpaceId.eq(space_id))
32 .all(&reader)
33 .await
34 .map_err(|e| async_graphql::Error::new(format!("db: {e}")))?;
35 Ok(rows.into_iter().map(ProjectGql::from).collect())
36 }
37
38 async fn project_members(
39 &self,
40 ctx: &Context<'_>,
41 project_id: String,
42 ) -> GqlResult<Vec<ProjectMemberGql>> {
43 let svc = ctx.data::<ProjectService>()?;
44 let project_id = parse_id(&project_id)?;
45 let reader = svc.db.reader();
46 let rows = db::project::project_members::Entity::find()
47 .filter(db::project::project_members::Column::ProjectId.eq(project_id))
48 .all(&reader)
49 .await
50 .map_err(|e| async_graphql::Error::new(format!("db: {e}")))?;
51 Ok(rows.into_iter().map(ProjectMemberGql::from).collect())
52 }
53}
54
55pub struct MutationRoot;
56
57#[Object]
58impl MutationRoot {
59 async fn create_project(&self, _name: String) -> GqlResult<ProjectGql> {
60 Err(async_graphql::Error::new(
61 "GraphQL mutations are stubs — use REST handlers",
62 ))
63 }
64
65 async fn star_project(&self, _project_id: String) -> GqlResult<bool> {
66 Ok(false)
67 }
68}
No newline at end of file