// Code generated by sqlc. DO NOT EDIT. // versions: // sqlc v1.31.1 // source: project.sql package db import ( "context" "github.com/jackc/pgx/v5/pgtype" ) const addProjectSpace = `-- name: AddProjectSpace :exec INSERT INTO project_space (workspace_id, project_id, space_id) VALUES ($1, $2, $3) ON CONFLICT (project_id, space_id) DO NOTHING ` type AddProjectSpaceParams struct { WorkspaceID pgtype.UUID `json:"workspace_id"` ProjectID pgtype.UUID `json:"project_id"` SpaceID pgtype.UUID `json:"space_id"` } func (q *Queries) AddProjectSpace(ctx context.Context, arg AddProjectSpaceParams) error { _, err := q.db.Exec(ctx, addProjectSpace, arg.WorkspaceID, arg.ProjectID, arg.SpaceID) return err } const countIssuesByProject = `-- name: CountIssuesByProject :one SELECT count(*) FROM issue WHERE project_id = $1 ` func (q *Queries) CountIssuesByProject(ctx context.Context, projectID pgtype.UUID) (int64, error) { row := q.db.QueryRow(ctx, countIssuesByProject, projectID) var count int64 err := row.Scan(&count) return count, err } const createProject = `-- name: CreateProject :one INSERT INTO project ( workspace_id, title, description, icon, status, lead_type, lead_id, priority ) VALUES ( $1, $2, $3, $4, $5, $6, $7, $8 ) RETURNING id, workspace_id, title, description, icon, status, lead_type, lead_id, created_at, updated_at, priority ` type CreateProjectParams struct { WorkspaceID pgtype.UUID `json:"workspace_id"` Title string `json:"title"` Description pgtype.Text `json:"description"` Icon pgtype.Text `json:"icon"` Status string `json:"status"` LeadType pgtype.Text `json:"lead_type"` LeadID pgtype.UUID `json:"lead_id"` Priority string `json:"priority"` } func (q *Queries) CreateProject(ctx context.Context, arg CreateProjectParams) (Project, error) { row := q.db.QueryRow(ctx, createProject, arg.WorkspaceID, arg.Title, arg.Description, arg.Icon, arg.Status, arg.LeadType, arg.LeadID, arg.Priority, ) var i Project err := row.Scan( &i.ID, &i.WorkspaceID, &i.Title, &i.Description, &i.Icon, &i.Status, &i.LeadType, &i.LeadID, &i.CreatedAt, &i.UpdatedAt, &i.Priority, ) return i, err } const deleteProject = `-- name: DeleteProject :exec DELETE FROM project WHERE id = $1 AND workspace_id = $2 ` type DeleteProjectParams struct { ID pgtype.UUID `json:"id"` WorkspaceID pgtype.UUID `json:"workspace_id"` } // Defense-in-depth: workspace_id is a SQL-layer tenant guard. See DeleteIssue. func (q *Queries) DeleteProject(ctx context.Context, arg DeleteProjectParams) error { _, err := q.db.Exec(ctx, deleteProject, arg.ID, arg.WorkspaceID) return err } const getProject = `-- name: GetProject :one SELECT id, workspace_id, title, description, icon, status, lead_type, lead_id, created_at, updated_at, priority FROM project WHERE id = $1 ` func (q *Queries) GetProject(ctx context.Context, id pgtype.UUID) (Project, error) { row := q.db.QueryRow(ctx, getProject, id) var i Project err := row.Scan( &i.ID, &i.WorkspaceID, &i.Title, &i.Description, &i.Icon, &i.Status, &i.LeadType, &i.LeadID, &i.CreatedAt, &i.UpdatedAt, &i.Priority, ) return i, err } const getProjectInWorkspace = `-- name: GetProjectInWorkspace :one SELECT id, workspace_id, title, description, icon, status, lead_type, lead_id, created_at, updated_at, priority FROM project WHERE id = $1 AND workspace_id = $2 ` type GetProjectInWorkspaceParams struct { ID pgtype.UUID `json:"id"` WorkspaceID pgtype.UUID `json:"workspace_id"` } func (q *Queries) GetProjectInWorkspace(ctx context.Context, arg GetProjectInWorkspaceParams) (Project, error) { row := q.db.QueryRow(ctx, getProjectInWorkspace, arg.ID, arg.WorkspaceID) var i Project err := row.Scan( &i.ID, &i.WorkspaceID, &i.Title, &i.Description, &i.Icon, &i.Status, &i.LeadType, &i.LeadID, &i.CreatedAt, &i.UpdatedAt, &i.Priority, ) return i, err } const getProjectIssueStats = `-- name: GetProjectIssueStats :many SELECT project_id, count(*)::bigint AS total_count, count(*) FILTER (WHERE status IN ('done', 'cancelled'))::bigint AS done_count FROM issue WHERE project_id = ANY($1::uuid[]) GROUP BY project_id ` type GetProjectIssueStatsRow struct { ProjectID pgtype.UUID `json:"project_id"` TotalCount int64 `json:"total_count"` DoneCount int64 `json:"done_count"` } func (q *Queries) GetProjectIssueStats(ctx context.Context, projectIds []pgtype.UUID) ([]GetProjectIssueStatsRow, error) { rows, err := q.db.Query(ctx, getProjectIssueStats, projectIds) if err != nil { return nil, err } defer rows.Close() items := []GetProjectIssueStatsRow{} for rows.Next() { var i GetProjectIssueStatsRow if err := rows.Scan(&i.ProjectID, &i.TotalCount, &i.DoneCount); err != nil { return nil, err } items = append(items, i) } if err := rows.Err(); err != nil { return nil, err } return items, nil } const listProjectSpaces = `-- name: ListProjectSpaces :many SELECT wt.id, wt.workspace_id, wt.name, wt.key, wt.description, wt.icon, wt.issue_counter, wt.archived_at, wt.archived_by, wt.created_by, wt.created_at, wt.updated_at FROM workspace_space wt JOIN project_space pt ON pt.space_id = wt.id AND pt.workspace_id = wt.workspace_id WHERE pt.workspace_id = $1 AND pt.project_id = $2 ORDER BY wt.name ASC, wt.created_at ASC ` type ListProjectSpacesParams struct { WorkspaceID pgtype.UUID `json:"workspace_id"` ProjectID pgtype.UUID `json:"project_id"` } func (q *Queries) ListProjectSpaces(ctx context.Context, arg ListProjectSpacesParams) ([]WorkspaceSpace, error) { rows, err := q.db.Query(ctx, listProjectSpaces, arg.WorkspaceID, arg.ProjectID) if err != nil { return nil, err } defer rows.Close() items := []WorkspaceSpace{} for rows.Next() { var i WorkspaceSpace if err := rows.Scan( &i.ID, &i.WorkspaceID, &i.Name, &i.Key, &i.Description, &i.Icon, &i.IssueCounter, &i.ArchivedAt, &i.ArchivedBy, &i.CreatedBy, &i.CreatedAt, &i.UpdatedAt, ); err != nil { return nil, err } items = append(items, i) } if err := rows.Err(); err != nil { return nil, err } return items, nil } const listProjectSpacesByProjects = `-- name: ListProjectSpacesByProjects :many SELECT pt.project_id, wt.id, wt.workspace_id, wt.name, wt.key, wt.description, wt.icon, wt.issue_counter, wt.archived_at, wt.archived_by, wt.created_by, wt.created_at, wt.updated_at FROM project_space pt JOIN workspace_space wt ON wt.id = pt.space_id AND wt.workspace_id = pt.workspace_id WHERE pt.workspace_id = $1 AND pt.project_id = ANY($2::uuid[]) ORDER BY pt.project_id, wt.name ASC, wt.created_at ASC ` type ListProjectSpacesByProjectsParams struct { WorkspaceID pgtype.UUID `json:"workspace_id"` ProjectIds []pgtype.UUID `json:"project_ids"` } type ListProjectSpacesByProjectsRow struct { ProjectID pgtype.UUID `json:"project_id"` ID pgtype.UUID `json:"id"` WorkspaceID pgtype.UUID `json:"workspace_id"` Name string `json:"name"` Key string `json:"key"` Description string `json:"description"` Icon pgtype.Text `json:"icon"` IssueCounter int32 `json:"issue_counter"` ArchivedAt pgtype.Timestamptz `json:"archived_at"` ArchivedBy pgtype.UUID `json:"archived_by"` CreatedBy pgtype.UUID `json:"created_by"` CreatedAt pgtype.Timestamptz `json:"created_at"` UpdatedAt pgtype.Timestamptz `json:"updated_at"` } func (q *Queries) ListProjectSpacesByProjects(ctx context.Context, arg ListProjectSpacesByProjectsParams) ([]ListProjectSpacesByProjectsRow, error) { rows, err := q.db.Query(ctx, listProjectSpacesByProjects, arg.WorkspaceID, arg.ProjectIds) if err != nil { return nil, err } defer rows.Close() items := []ListProjectSpacesByProjectsRow{} for rows.Next() { var i ListProjectSpacesByProjectsRow if err := rows.Scan( &i.ProjectID, &i.ID, &i.WorkspaceID, &i.Name, &i.Key, &i.Description, &i.Icon, &i.IssueCounter, &i.ArchivedAt, &i.ArchivedBy, &i.CreatedBy, &i.CreatedAt, &i.UpdatedAt, ); err != nil { return nil, err } items = append(items, i) } if err := rows.Err(); err != nil { return nil, err } return items, nil } const listProjects = `-- name: ListProjects :many SELECT id, workspace_id, title, description, icon, status, lead_type, lead_id, created_at, updated_at, priority FROM project WHERE project.workspace_id = $1 AND ($2::uuid IS NULL OR EXISTS ( SELECT 1 FROM project_space pt WHERE pt.project_id = project.id AND pt.workspace_id = project.workspace_id AND pt.space_id = $2::uuid )) AND ($3::text IS NULL OR project.status = $3) AND ($4::text IS NULL OR project.priority = $4) ORDER BY created_at DESC ` type ListProjectsParams struct { WorkspaceID pgtype.UUID `json:"workspace_id"` SpaceID pgtype.UUID `json:"space_id"` Status pgtype.Text `json:"status"` Priority pgtype.Text `json:"priority"` } func (q *Queries) ListProjects(ctx context.Context, arg ListProjectsParams) ([]Project, error) { rows, err := q.db.Query(ctx, listProjects, arg.WorkspaceID, arg.SpaceID, arg.Status, arg.Priority, ) if err != nil { return nil, err } defer rows.Close() items := []Project{} for rows.Next() { var i Project if err := rows.Scan( &i.ID, &i.WorkspaceID, &i.Title, &i.Description, &i.Icon, &i.Status, &i.LeadType, &i.LeadID, &i.CreatedAt, &i.UpdatedAt, &i.Priority, ); err != nil { return nil, err } items = append(items, i) } if err := rows.Err(); err != nil { return nil, err } return items, nil } const replaceProjectSpaces = `-- name: ReplaceProjectSpaces :exec WITH deleted AS ( DELETE FROM project_space WHERE workspace_id = $1 AND project_id = $2 AND NOT (space_id = ANY($3::uuid[])) ) INSERT INTO project_space (workspace_id, project_id, space_id) SELECT $1, $2, unnest($3::uuid[]) ON CONFLICT (project_id, space_id) DO NOTHING ` type ReplaceProjectSpacesParams struct { WorkspaceID pgtype.UUID `json:"workspace_id"` ProjectID pgtype.UUID `json:"project_id"` SpaceIds []pgtype.UUID `json:"space_ids"` } func (q *Queries) ReplaceProjectSpaces(ctx context.Context, arg ReplaceProjectSpacesParams) error { _, err := q.db.Exec(ctx, replaceProjectSpaces, arg.WorkspaceID, arg.ProjectID, arg.SpaceIds) return err } const updateProject = `-- name: UpdateProject :one UPDATE project SET title = COALESCE($2, title), description = $3, icon = $4, status = COALESCE($5, status), priority = COALESCE($6, priority), lead_type = $7, lead_id = $8, updated_at = now() WHERE id = $1 RETURNING id, workspace_id, title, description, icon, status, lead_type, lead_id, created_at, updated_at, priority ` type UpdateProjectParams struct { ID pgtype.UUID `json:"id"` Title pgtype.Text `json:"title"` Description pgtype.Text `json:"description"` Icon pgtype.Text `json:"icon"` Status pgtype.Text `json:"status"` Priority pgtype.Text `json:"priority"` LeadType pgtype.Text `json:"lead_type"` LeadID pgtype.UUID `json:"lead_id"` } func (q *Queries) UpdateProject(ctx context.Context, arg UpdateProjectParams) (Project, error) { row := q.db.QueryRow(ctx, updateProject, arg.ID, arg.Title, arg.Description, arg.Icon, arg.Status, arg.Priority, arg.LeadType, arg.LeadID, ) var i Project err := row.Scan( &i.ID, &i.WorkspaceID, &i.Title, &i.Description, &i.Icon, &i.Status, &i.LeadType, &i.LeadID, &i.CreatedAt, &i.UpdatedAt, &i.Priority, ) return i, err }