Skip to content

Commit bcbb891

Browse files
committed
Merge branch 'main' into feat/CORE-370-cancel-submission
2 parents 2ecd136 + d697bee commit bcbb891

100 files changed

Lines changed: 2513 additions & 1283 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/workflows/pre-commit.yaml‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,12 @@ jobs:
3636
- name: Setup go
3737
uses: actions/setup-go@v5
3838
with:
39-
go-version: "1.24"
39+
go-version: "1.26.2"
4040

4141
- name: Lint
42-
uses: golangci/golangci-lint-action@v7
42+
uses: golangci/golangci-lint-action@v9
4343
with:
44-
version: v2.0
44+
version: v2.12
4545

4646
Test:
4747
needs: check-if-in-pr
@@ -54,7 +54,7 @@ jobs:
5454
- name: Setup go
5555
uses: actions/setup-go@v5
5656
with:
57-
go-version: "1.24"
57+
go-version: "1.26.2"
5858

5959
- name: Setup Sqlc
6060
uses: sqlc-dev/setup-sqlc@v4
@@ -80,7 +80,7 @@ jobs:
8080
- name: Setup go
8181
uses: actions/setup-go@v5
8282
with:
83-
go-version: "1.24"
83+
go-version: "1.26.2"
8484

8585
- name: Setup Sqlc
8686
uses: sqlc-dev/setup-sqlc@v4

‎.github/workflows/release.yaml‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ jobs:
1717
- name: Setup go
1818
uses: actions/setup-go@v5
1919
with:
20-
go-version: "1.24"
20+
go-version: "1.26.2"
2121

2222
- name: Lint
23-
uses: golangci/golangci-lint-action@v7
23+
uses: golangci/golangci-lint-action@v9
2424
with:
25-
version: v2.0
25+
version: v2.12
2626

2727
Test:
2828
needs: Lint
@@ -34,7 +34,7 @@ jobs:
3434
- name: Setup go
3535
uses: actions/setup-go@v5
3636
with:
37-
go-version: "1.24"
37+
go-version: "1.26.2"
3838

3939
- name: Setup Sqlc
4040
uses: sqlc-dev/setup-sqlc@v4
@@ -59,7 +59,7 @@ jobs:
5959
- name: Setup go
6060
uses: actions/setup-go@v5
6161
with:
62-
go-version: "1.24"
62+
go-version: "1.26.2"
6363

6464
- name: Setup Sqlc
6565
uses: sqlc-dev/setup-sqlc@v4

‎.github/workflows/snapshot.yaml‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ jobs:
1616
- name: Setup go
1717
uses: actions/setup-go@v5
1818
with:
19-
go-version: "1.24"
19+
go-version: "1.26.2"
2020

2121
- name: Lint
22-
uses: golangci/golangci-lint-action@v7
22+
uses: golangci/golangci-lint-action@v9
2323
with:
24-
version: v2.0
24+
version: v2.12
2525

2626
Test:
2727
runs-on: ubuntu-latest
@@ -32,7 +32,7 @@ jobs:
3232
- name: Setup go
3333
uses: actions/setup-go@v5
3434
with:
35-
go-version: "1.24"
35+
go-version: "1.26.2"
3636

3737
- name: Setup Sqlc
3838
uses: sqlc-dev/setup-sqlc@v4
@@ -57,7 +57,7 @@ jobs:
5757
- name: Setup go
5858
uses: actions/setup-go@v5
5959
with:
60-
go-version: "1.24"
60+
go-version: "1.26.2"
6161

6262
- name: Setup Sqlc
6363
uses: sqlc-dev/setup-sqlc@v4

‎Dockerfile‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM golang:1.24
1+
FROM golang:1.26.2
22

33
WORKDIR /app
44

‎Makefile‎

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,5 @@ gen:
4242
@./scripts/create_sqlc_full_schema.sh || (echo -e " -> $(RED)Schema creation failed$(NC)" && exit 1)
4343
@echo -e " -> Generating SQLC code..."
4444
@sqlc generate || (echo -e " -> $(RED)SQLC generation failed$(NC)" && exit 1)
45-
# @echo -e " -> Generating Casbin Policyfile..."
46-
# @./scripts/create_casbin_full_policy.sh || (echo -e " -> $(RED)Policyfile generation failed$(NC)" && exit 1)
47-
# @echo -e " -> Running go generate..."
4845
@go generate ./... || (echo -e " -> $(RED)Go generate failed$(NC)" && exit 1)
4946
@echo -e "==> $(BLUE)Generation completed$(NC)"

‎README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## Requirements
44

5-
- **Go**: 1.24.2 or higher
5+
- **Go**: 1.26.2 or higher
66
- **PostgreSQL**: 18
77
- **Docker** (optional): for running PostgreSQL container
88
- **SQLC**: for code generation

‎cmd/backend/main.go‎

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -162,13 +162,13 @@ func main() {
162162
answerFileHandler := answer.NewFileResourceHandler(logger, answerQueries)
163163
fileService := file.NewService(logger, dbPool, answerFileHandler)
164164

165-
setupImpl := config.SetupImpl{}
166-
err = setupImpl.LoadSetupConfig(logger, cfg.SetupPath, cfg.SetupData)
165+
setupCfg := config.Setup{}
166+
err = setupCfg.LoadSetupConfig(logger, cfg.SetupPath, cfg.SetupData)
167167
if err != nil {
168168
logger.Fatal("Failed to load setup configuration", zap.Error(err))
169169
}
170170

171-
userService := user.NewService(logger, dbPool, fileService, unitService, unitService, &setupImpl)
171+
userService := user.NewService(logger, dbPool, fileService, unitService, unitService, &setupCfg)
172172
jwtService := jwt.NewService(logger, dbPool, cfg.Secret, cfg.OauthProxySecret, cfg.AccessTokenExpiration, cfg.RefreshTokenExpiration)
173173
distributeService := distribute.NewService(logger, unitService)
174174
markdownService := markdown.NewService(logger)
@@ -182,7 +182,7 @@ func main() {
182182
submitService := submit.NewService(logger, formService, questionService, responseService, answerService)
183183
publishService := publish.NewService(logger, distributeService, formService, inboxService, workflowService)
184184

185-
setupService := setup.NewService(logger, setupImpl, unitService, userService)
185+
setupService := setup.NewService(logger, setupCfg, unitService, userService)
186186
err = setupService.Setup(context.Background())
187187
if err != nil {
188188
logger.Fatal("Failed to setup", zap.Error(err))
@@ -250,9 +250,9 @@ func main() {
250250
formCreator := formRole.Require(formResolver)
251251
formOwner := op.Or(unitAdmin, op.And(unitMember, formCreator))
252252

253-
notArchivedByForm := formMiddleware.Require(formResolver)
254-
notArchivedBySection := formMiddleware.Require(sectionResolver)
255-
notArchivedByResponse := formMiddleware.Require(responseResolver)
253+
availableByForm := formMiddleware.Require(formResolver)
254+
availableBySection := formMiddleware.Require(sectionResolver)
255+
availableByResponse := formMiddleware.Require(responseResolver)
256256

257257
// HTTP Server
258258
mux := http.NewServeMux()
@@ -349,22 +349,23 @@ func main() {
349349

350350
// Form Management
351351
// ----------------------
352-
mux.Handle("GET /api/forms", authMiddleware.HandlerFunc(formHandler.ListHandler))
353-
mux.Handle("GET /api/forms/{formId}", authMiddleware.HandlerFunc(formHandler.GetHandler))
354-
mux.Handle("GET /api/orgs/{slug}/forms", tenantAuthMiddleware.Append(unitRole.Require(auth.RoleMember, slugResolver)).HandlerFunc(formHandler.ListByOrgHandler))
355-
mux.Handle("POST /api/orgs/{slug}/forms", tenantAuthMiddleware.Append(unitRole.Require(auth.RoleMember, slugResolver)).HandlerFunc(formHandler.CreateUnderOrgHandler))
356-
mux.Handle("PATCH /api/forms/{formId}", authMiddleware.Append(unitRole.Require(auth.RoleMember, formResolver)).Append(notArchivedByForm).HandlerFunc(formHandler.PatchHandler))
357-
mux.Handle("DELETE /api/forms/{formId}", authMiddleware.Append(formOwner).HandlerFunc(formHandler.DeleteHandler))
352+
mux.Handle("GET /api/forms", authMiddleware.HandlerFunc(formHandler.List))
353+
mux.Handle("GET /api/forms/{formId}", authMiddleware.HandlerFunc(formHandler.Get))
354+
mux.Handle("GET /api/orgs/{slug}/forms", tenantAuthMiddleware.Append(unitRole.Require(auth.RoleMember, slugResolver)).HandlerFunc(formHandler.ListByOrg))
355+
mux.Handle("POST /api/orgs/{slug}/forms", tenantAuthMiddleware.Append(unitRole.Require(auth.RoleMember, slugResolver)).HandlerFunc(formHandler.CreateUnderOrg))
356+
mux.Handle("PATCH /api/forms/{formId}", authMiddleware.Append(unitRole.Require(auth.RoleMember, formResolver)).Append(availableByForm).HandlerFunc(formHandler.Patch))
357+
mux.Handle("DELETE /api/forms/{formId}", authMiddleware.Append(formOwner).HandlerFunc(formHandler.Delete))
358358

359359
// Form Resource
360-
mux.Handle("GET /api/forms/fonts", authMiddleware.HandlerFunc(formHandler.GetFontsHandler))
361-
mux.Handle("GET /api/forms/{formId}/cover", authMiddleware.HandlerFunc(formHandler.GetCoverImageHandler))
362-
mux.Handle("POST /api/forms/{formId}/cover", authMiddleware.Append(unitRole.Require(auth.RoleMember, formResolver)).Append(notArchivedByForm).HandlerFunc(formHandler.UploadCoverImageHandler))
360+
mux.Handle("GET /api/forms/fonts", authMiddleware.HandlerFunc(formHandler.GetFonts))
361+
mux.Handle("GET /api/forms/{formId}/cover", authMiddleware.HandlerFunc(formHandler.GetCoverImage))
362+
mux.Handle("POST /api/forms/{formId}/cover", authMiddleware.Append(unitRole.Require(auth.RoleMember, formResolver)).Append(availableByForm).HandlerFunc(formHandler.UploadCoverImage))
363363

364364
// Form Operations
365-
mux.Handle("POST /api/forms/{formId}/unarchive", authMiddleware.Append(unitRole.Require(auth.RoleAdmin, formResolver)).HandlerFunc(formHandler.UnarchiveHandler))
366-
mux.Handle("POST /api/forms/{formId}/archive", authMiddleware.Append(unitRole.Require(auth.RoleAdmin, formResolver)).HandlerFunc(formHandler.ArchiveHandler))
365+
mux.Handle("POST /api/forms/{formId}/unarchive", authMiddleware.Append(unitRole.Require(auth.RoleAdmin, formResolver)).HandlerFunc(formHandler.Unarchive))
366+
mux.Handle("POST /api/forms/{formId}/archive", authMiddleware.Append(unitRole.Require(auth.RoleAdmin, formResolver)).HandlerFunc(formHandler.Archive))
367367
mux.Handle("POST /api/forms/{formId}/publish", authMiddleware.Append(unitRole.Require(auth.RoleMember, formResolver)).HandlerFunc(publishHandler.PublishForm))
368+
mux.Handle("POST /api/forms/{formId}/close", authMiddleware.Append(unitRole.Require(auth.RoleMember, formResolver)).HandlerFunc(formHandler.Close))
368369
mux.Handle("GET /api/forms/{formId}/highlight", authMiddleware.Append(unitRole.Require(auth.RoleMember, formResolver)).HandlerFunc(highlightHandler.Get))
369370
mux.Handle("PUT /api/forms/{formId}/highlight", authMiddleware.Append(unitRole.Require(auth.RoleMember, formResolver)).HandlerFunc(highlightHandler.Put))
370371
mux.Handle("PATCH /api/forms/{formId}/highlight", authMiddleware.Append(unitRole.Require(auth.RoleMember, formResolver)).HandlerFunc(highlightHandler.Patch))
@@ -375,13 +376,13 @@ func main() {
375376
// --- (Get sections will also return questions)
376377
mux.Handle("GET /api/forms/{formId}/sections", authMiddleware.HandlerFunc(questionHandler.ListHandler))
377378
// --- (Create sections via the workflow endpoint, not a direct sections API call)
378-
mux.Handle("PATCH /api/forms/{formId}/sections/{sectionId}", authMiddleware.Append(unitRole.Require(auth.RoleMember, sectionResolver)).Append(notArchivedByForm).HandlerFunc(formHandler.UpdateSectionHandler))
379+
mux.Handle("PATCH /api/forms/{formId}/sections/{sectionId}", authMiddleware.Append(unitRole.Require(auth.RoleMember, sectionResolver)).Append(availableByForm).HandlerFunc(formHandler.UpdateSection))
379380

380381
// Question Management
381382
// ----------------------
382-
mux.Handle("POST /api/sections/{sectionId}/questions", authMiddleware.Append(unitRole.Require(auth.RoleMember, sectionResolver)).Append(notArchivedBySection).HandlerFunc(questionHandler.AddHandler))
383-
mux.Handle("PUT /api/sections/{sectionId}/questions/{questionId}", authMiddleware.Append(unitRole.Require(auth.RoleMember, sectionResolver)).Append(notArchivedBySection).HandlerFunc(questionHandler.UpdateHandler))
384-
mux.Handle("DELETE /api/sections/{sectionId}/questions/{questionId}", authMiddleware.Append(unitRole.Require(auth.RoleMember, sectionResolver)).Append(notArchivedBySection).HandlerFunc(questionHandler.DeleteHandler))
383+
mux.Handle("POST /api/sections/{sectionId}/questions", authMiddleware.Append(unitRole.Require(auth.RoleMember, sectionResolver)).Append(availableBySection).HandlerFunc(questionHandler.AddHandler))
384+
mux.Handle("PUT /api/sections/{sectionId}/questions/{questionId}", authMiddleware.Append(unitRole.Require(auth.RoleMember, sectionResolver)).Append(availableBySection).HandlerFunc(questionHandler.UpdateHandler))
385+
mux.Handle("DELETE /api/sections/{sectionId}/questions/{questionId}", authMiddleware.Append(unitRole.Require(auth.RoleMember, sectionResolver)).Append(availableBySection).HandlerFunc(questionHandler.DeleteHandler))
385386

386387
// Response Management
387388
// ----------------------
@@ -390,27 +391,27 @@ func main() {
390391
mux.Handle("POST /api/forms/{formId}/responses/export/preview", authMiddleware.Append(unitRole.Require(auth.RoleMember, formResolver)).HandlerFunc(responseHandler.ExportPreview))
391392
mux.Handle("POST /api/forms/{formId}/responses/export/download", authMiddleware.Append(unitRole.Require(auth.RoleMember, formResolver)).HandlerFunc(responseHandler.ExportDownload))
392393
mux.Handle("GET /api/forms/{formId}/responses/{responseId}", authMiddleware.HandlerFunc(responseHandler.Get))
393-
mux.Handle("POST /api/forms/{formId}/responses", authMiddleware.Append(notArchivedByForm).HandlerFunc(responseHandler.Create))
394+
mux.Handle("POST /api/forms/{formId}/responses", authMiddleware.Append(availableByForm).HandlerFunc(responseHandler.Create))
394395
mux.Handle("DELETE /api/forms/{formId}/responses/{responseId}", authMiddleware.Append(formOwner).HandlerFunc(responseHandler.Delete))
395396

396397
// Response Operations
397-
mux.Handle("POST /api/responses/{responseId}/submit", authMiddleware.Append(notArchivedByResponse).HandlerFunc(submitHandler.SubmitHandler))
398-
mux.Handle("POST /api/responses/{responseId}/cancel", authMiddleware.Append(notArchivedByResponse).HandlerFunc(responseHandler.Cancel))
398+
mux.Handle("POST /api/responses/{responseId}/submit", authMiddleware.Append(availableByResponse).HandlerFunc(submitHandler.SubmitHandler))
399+
mux.Handle("POST /api/responses/{responseId}/cancel", authMiddleware.Append(availableByResponse).HandlerFunc(responseHandler.Cancel))
399400

400401
// Answer Management
401402
// ----------------------
402403
mux.Handle("GET /api/responses/{responseId}/questions/{questionId}", authMiddleware.HandlerFunc(answerHandler.GetQuestionResponse))
403-
mux.Handle("PATCH /api/responses/{responseId}/answers", authMiddleware.Append(notArchivedByResponse).HandlerFunc(answerHandler.UpdateFormResponse))
404-
mux.Handle("POST /api/responses/{responseId}/questions/{questionId}/files", authMiddleware.Append(notArchivedByResponse).HandlerFunc(answerHandler.UploadQuestionFiles))
405-
mux.Handle("GET /api/responses/{responseId}/questions/{questionId}/oauth", authMiddleware.HandlerFunc(answerHandler.ConnectOAuthAccountStart))
404+
mux.Handle("PATCH /api/responses/{responseId}/answers", authMiddleware.Append(availableByResponse).HandlerFunc(answerHandler.UpdateFormResponse))
405+
mux.Handle("POST /api/responses/{responseId}/questions/{questionId}/files", authMiddleware.Append(availableByResponse).HandlerFunc(answerHandler.UploadQuestionFiles))
406+
mux.Handle("GET /api/responses/{responseId}/questions/{questionId}/oauth", authMiddleware.Append(availableByResponse).HandlerFunc(answerHandler.ConnectOAuthAccountStart))
406407
mux.Handle("GET /api/oauth/questions/{provider}/callback", authMiddleware.HandlerFunc(answerHandler.OAuthAnswerCallback))
407408

408409
// Workflow Management
409410
// ----------------------
410411
mux.Handle("GET /api/forms/{formId}/workflow", authMiddleware.HandlerFunc(workflowHandler.GetHandler))
411-
mux.Handle("POST /api/forms/{formId}/workflow/nodes", authMiddleware.Append(unitRole.Require(auth.RoleMember, formResolver)).Append(notArchivedByForm).HandlerFunc(workflowHandler.CreateNodeHandler))
412-
mux.Handle("PUT /api/forms/{formId}/workflow", authMiddleware.Append(unitRole.Require(auth.RoleMember, formResolver)).Append(notArchivedByForm).HandlerFunc(workflowHandler.UpdateHandler))
413-
mux.Handle("DELETE /api/forms/{formId}/workflow/nodes/{nodeId}", authMiddleware.Append(unitRole.Require(auth.RoleMember, formResolver)).Append(notArchivedByForm).HandlerFunc(workflowHandler.DeleteNodeHandler))
412+
mux.Handle("POST /api/forms/{formId}/workflow/nodes", authMiddleware.Append(unitRole.Require(auth.RoleMember, formResolver)).Append(availableByForm).HandlerFunc(workflowHandler.CreateNodeHandler))
413+
mux.Handle("PUT /api/forms/{formId}/workflow", authMiddleware.Append(unitRole.Require(auth.RoleMember, formResolver)).Append(availableByForm).HandlerFunc(workflowHandler.UpdateHandler))
414+
mux.Handle("DELETE /api/forms/{formId}/workflow/nodes/{nodeId}", authMiddleware.Append(unitRole.Require(auth.RoleMember, formResolver)).Append(availableByForm).HandlerFunc(workflowHandler.DeleteNodeHandler))
414415

415416
// View Management
416417
// ----------------------

0 commit comments

Comments
 (0)