diff --git a/db/query/submission.sql b/db/query/submission.sql index 0b2a51d..fc40d7c 100644 --- a/db/query/submission.sql +++ b/db/query/submission.sql @@ -66,34 +66,38 @@ UPDATE submissions SET status = COALESCE(sqlc.narg('status'), status), reviewed_by = COALESCE(sqlc.narg('reviewed_by'), reviewed_by), + reviewed_at = CASE WHEN sqlc.narg('status') IS NOT NULL THEN NOW() ELSE reviewed_at END, review_note = COALESCE(sqlc.narg('review_note'), review_note), content = COALESCE(sqlc.narg('content'), content) -FROM projects p, users u -LEFT JOIN user_profiles up ON u.id = up.user_id -LEFT JOIN users ru ON submissions.reviewed_by = ru.id -LEFT JOIN user_profiles rup ON ru.id = rup.user_id WHERE submissions.id = sqlc.arg('id') - AND submissions.project_id = p.id - AND submissions.user_id = u.id RETURNING submissions.id, submissions.project_id, submissions.commit_id, submissions.user_id, submissions.created_at, submissions.status, submissions.reviewed_by, submissions.reviewed_at, submissions.review_note, submissions.content, submissions.is_deleted, - p.title AS project_title, p.description AS project_description, - json_build_object( - 'id', u.id, - 'email', u.email, - 'display_name', up.display_name, - 'full_name', up.full_name, - 'avatar_url', up.avatar_url + (SELECT title FROM projects WHERE id = submissions.project_id) AS project_title, + (SELECT description FROM projects WHERE id = submissions.project_id) AS project_description, + ( + SELECT json_build_object( + 'id', u.id, + 'email', u.email, + 'display_name', up.display_name, + 'full_name', up.full_name, + 'avatar_url', up.avatar_url + ) + FROM users u + LEFT JOIN user_profiles up ON u.id = up.user_id + WHERE u.id = submissions.user_id )::json AS user, - CASE WHEN submissions.reviewed_by IS NOT NULL THEN - json_build_object( + ( + SELECT json_build_object( 'id', ru.id, 'email', ru.email, 'display_name', rup.display_name, 'full_name', rup.full_name, 'avatar_url', rup.avatar_url - )::json - ELSE NULL::json END AS reviewer; + ) + FROM users ru + LEFT JOIN user_profiles rup ON ru.id = rup.user_id + WHERE ru.id = submissions.reviewed_by + )::json AS reviewer; -- name: DeleteSubmission :exec UPDATE submissions diff --git a/internal/gen/sqlc/submission.sql.go b/internal/gen/sqlc/submission.sql.go index 9731ce5..2307b82 100644 --- a/internal/gen/sqlc/submission.sql.go +++ b/internal/gen/sqlc/submission.sql.go @@ -451,34 +451,38 @@ UPDATE submissions SET status = COALESCE($1, status), reviewed_by = COALESCE($2, reviewed_by), + reviewed_at = CASE WHEN $1 IS NOT NULL THEN NOW() ELSE reviewed_at END, review_note = COALESCE($3, review_note), content = COALESCE($4, content) -FROM projects p, users u -LEFT JOIN user_profiles up ON u.id = up.user_id -LEFT JOIN users ru ON submissions.reviewed_by = ru.id -LEFT JOIN user_profiles rup ON ru.id = rup.user_id WHERE submissions.id = $5 - AND submissions.project_id = p.id - AND submissions.user_id = u.id RETURNING submissions.id, submissions.project_id, submissions.commit_id, submissions.user_id, submissions.created_at, submissions.status, submissions.reviewed_by, submissions.reviewed_at, submissions.review_note, submissions.content, submissions.is_deleted, - p.title AS project_title, p.description AS project_description, - json_build_object( - 'id', u.id, - 'email', u.email, - 'display_name', up.display_name, - 'full_name', up.full_name, - 'avatar_url', up.avatar_url + (SELECT title FROM projects WHERE id = submissions.project_id) AS project_title, + (SELECT description FROM projects WHERE id = submissions.project_id) AS project_description, + ( + SELECT json_build_object( + 'id', u.id, + 'email', u.email, + 'display_name', up.display_name, + 'full_name', up.full_name, + 'avatar_url', up.avatar_url + ) + FROM users u + LEFT JOIN user_profiles up ON u.id = up.user_id + WHERE u.id = submissions.user_id )::json AS user, - CASE WHEN submissions.reviewed_by IS NOT NULL THEN - json_build_object( + ( + SELECT json_build_object( 'id', ru.id, 'email', ru.email, 'display_name', rup.display_name, 'full_name', rup.full_name, 'avatar_url', rup.avatar_url - )::json - ELSE NULL::json END AS reviewer + ) + FROM users ru + LEFT JOIN user_profiles rup ON ru.id = rup.user_id + WHERE ru.id = submissions.reviewed_by + )::json AS reviewer ` type UpdateSubmissionParams struct { diff --git a/internal/services/submissionService.go b/internal/services/submissionService.go index 27b86bc..2a48e1a 100644 --- a/internal/services/submissionService.go +++ b/internal/services/submissionService.go @@ -558,14 +558,13 @@ func (s *submissionService) UpdateSubmissionStatus(ctx context.Context, reviewer } updatedSubmission, err := submissionRepo.Update(ctx, arg) - if err != nil { - return nil, fiber.NewError(fiber.StatusInternalServerError, "Failed to update submission status") + return nil, fiber.NewError(fiber.StatusInternalServerError, "Failed to update submission status: " + err.Error()) } err = tx.Commit(ctx) if err != nil { - return nil, fiber.NewError(fiber.StatusInternalServerError, "Failed to commit transaction") + return nil, fiber.NewError(fiber.StatusInternalServerError, "Failed to commit transaction: " + err.Error()) } if status == constants.StatusTypeApproved { diff --git a/pkg/constants/time.go b/pkg/constants/time.go index 8dd156a..ae73c81 100644 --- a/pkg/constants/time.go +++ b/pkg/constants/time.go @@ -7,7 +7,7 @@ const ( TokenExpirationDuration = 20 * time.Minute NormalCacheDuration = 15 * time.Minute ListCacheDuration = 10 * time.Minute - AccessTokenDuration = 15 * time.Minute + AccessTokenDuration = 30 * time.Minute RefreshTokenDuration = 7 * 24 * time.Hour TokenVerifiedDuration = 10 * time.Minute PreSignedURLDuration = 15 * time.Minute