Skip to content

Commit 725c874

Browse files
authored
Merge pull request #74 from MonkyMars/feature/dashboard
Feature/dashboard
2 parents 40bcee3 + 13af043 commit 725c874

45 files changed

Lines changed: 1519 additions & 508 deletions

Some content is hidden

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

apps/server/.idea/.gitignore

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/server/.idea/modules.xml

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/server/.idea/server.iml

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/server/.idea/vcs.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package files
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/MonkyMars/PWS/api/response"
7+
"github.com/MonkyMars/PWS/services"
8+
"github.com/gofiber/fiber/v3"
9+
)
10+
11+
// /files/:fileId
12+
func GetSingleFile(c fiber.Ctx) error {
13+
// Get fileId from URL parameters
14+
fileID := c.Params("fileId")
15+
if fileID == "" {
16+
return response.BadRequest(c, "fileId parameter is required")
17+
}
18+
19+
// Retrieve file metadata from database
20+
contentService := services.NewContentService()
21+
file, err := contentService.GetFileByID(fileID)
22+
if err != nil {
23+
return response.InternalServerError(c, "Failed to retrieve file: "+err.Error())
24+
}
25+
if file == nil {
26+
return response.NotFound(c, "File not found")
27+
}
28+
29+
// Return file metadata
30+
return response.Success(c, file)
31+
}
32+
33+
// /files/subject/:subjectId/folder/:folderId
34+
func GetFilesBySubject(c fiber.Ctx) error {
35+
// Get subjectId from URL parameters
36+
subjectId := c.Params("subjectId")
37+
if subjectId == "" {
38+
return response.BadRequest(c, "subjectId parameter is required")
39+
}
40+
41+
folderId := c.Params("folderId")
42+
if folderId == "" {
43+
return response.BadRequest(c, "folderId parameter is required")
44+
}
45+
46+
// Retrieve files for the subject from database
47+
contentService := &services.ContentService{}
48+
files, err := contentService.GetFilesBySubjectID(subjectId, folderId)
49+
if err != nil {
50+
return response.InternalServerError(c, "Failed to retrieve files: "+err.Error())
51+
}
52+
53+
items := []any{}
54+
for _, file := range files {
55+
items = append(items, file)
56+
}
57+
58+
// Set pagination headers
59+
c.Set("X-Total-Count", fmt.Sprintf("%d", len(items)))
60+
c.Set("X-Total-Pages", fmt.Sprintf("%s", "1"))
61+
c.Set("X-Page-Size", fmt.Sprintf("%d", len(items)))
62+
63+
// Return list of files
64+
return response.Paginated(c, items, len(files), 1, len(files))
65+
}
66+
67+
func GetFoldersBySubjectParent(c fiber.Ctx) error {
68+
subjectId := c.Params("subjectId")
69+
if subjectId == "" {
70+
return response.BadRequest(c, "subjectId parameter is required")
71+
}
72+
73+
parentId := c.Params("parentId")
74+
if parentId == "" {
75+
return response.BadRequest(c, "parentId parameter is required")
76+
}
77+
78+
// Retrieve folders for the subject from database
79+
contentService := &services.ContentService{}
80+
folders, err := contentService.GetFoldersByParentID(subjectId, parentId)
81+
if err != nil {
82+
return response.InternalServerError(c, "Failed to retrieve folders: "+err.Error())
83+
}
84+
85+
items := []any{}
86+
for _, folder := range folders {
87+
items = append(items, folder)
88+
}
89+
90+
// Set pagination headers
91+
c.Set("X-Total-Count", fmt.Sprintf("%d", len(items)))
92+
c.Set("X-Total-Pages", fmt.Sprintf("%s", "1"))
93+
c.Set("X-Page-Size", fmt.Sprintf("%d", len(items)))
94+
95+
// Return list of folders
96+
return response.Paginated(c, items, len(folders), 1, len(folders))
97+
}
File renamed without changes.

apps/server/api/internal/files/retrieve.go

Lines changed: 0 additions & 48 deletions
This file was deleted.
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package internal
2+
3+
import (
4+
"github.com/MonkyMars/PWS/api/response"
5+
"github.com/MonkyMars/PWS/config"
6+
"github.com/MonkyMars/PWS/lib"
7+
"github.com/MonkyMars/PWS/services"
8+
"github.com/MonkyMars/PWS/types"
9+
"github.com/gofiber/fiber/v3"
10+
)
11+
12+
// GetSubjectByID retrieves a subject by its ID
13+
func GetSubjectByID(c fiber.Ctx) error {
14+
logger := config.SetupLogger()
15+
subjectID := c.Params("subjectId")
16+
17+
if subjectID == "" {
18+
return response.BadRequest(c, "Subject ID is required")
19+
}
20+
21+
subjectService := services.NewSubjectService()
22+
subject, err := subjectService.GetSubjectByID(subjectID)
23+
if err != nil {
24+
logger.Error("Failed to retrieve subject", "subject_id", subjectID, "error", err)
25+
return response.InternalServerError(c, "Failed to retrieve subject")
26+
}
27+
28+
if subject == nil {
29+
return response.NotFound(c, "Subject not found")
30+
}
31+
32+
return response.Success(c, subject)
33+
}
34+
35+
func GetAllSubjects(c fiber.Ctx) error {
36+
logger := config.SetupLogger()
37+
38+
subjectService := services.NewSubjectService()
39+
subjects, err := subjectService.GetAllSubjects()
40+
if err != nil {
41+
logger.Error("Failed to retrieve subjects", "error", err)
42+
return response.InternalServerError(c, "Failed to retrieve subjects")
43+
}
44+
45+
return response.Success(c, subjects)
46+
}
47+
48+
func GetUserSubjects(c fiber.Ctx) error {
49+
logger := config.SetupLogger()
50+
claimsInterface := c.Locals("claims")
51+
52+
if claimsInterface == nil {
53+
return response.Unauthorized(c, "Unauthorized")
54+
}
55+
56+
// Type assert claims
57+
claims, ok := claimsInterface.(*types.AuthClaims)
58+
if claims == nil || !ok {
59+
return response.Unauthorized(c, "Unauthorized")
60+
}
61+
62+
subjectService := services.NewSubjectService()
63+
var subjects []types.Subject
64+
switch claims.Role {
65+
case lib.RoleAdmin, lib.RoleTeacher:
66+
s, err := subjectService.GetAllSubjects()
67+
if err != nil {
68+
logger.Error("Failed to retrieve subjects", "error", err)
69+
return response.InternalServerError(c, "Failed to retrieve subjects")
70+
}
71+
subjects = s
72+
case lib.RoleStudent:
73+
s, err := subjectService.GetUserSubjects(claims.Sub.String())
74+
if err != nil {
75+
logger.Error("Failed to retrieve user subjects", "user_id", claims.Sub.String(), "error", err)
76+
return response.InternalServerError(c, "Failed to retrieve user subjects")
77+
}
78+
subjects = s
79+
default:
80+
return response.Forbidden(c, "You do not have permission to view subjects")
81+
}
82+
83+
return response.Success(c, subjects)
84+
}

apps/server/api/router.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ func SetupRoutes(app *fiber.App, logger *config.Logger) {
6262
// Files routes
6363
routes.SetupFileRoutes(app)
6464

65+
// Subjects routes
66+
routes.SetupSubjectRoutes(app)
67+
6568
// Health check and fallback route - Must be last to avoid conflicts
6669
routes.SetupAppRoutes(app)
6770
}
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package routes
22

33
import (
4-
internal_files "github.com/MonkyMars/PWS/api/internal/files"
4+
internal_files "github.com/MonkyMars/PWS/api/internal/content"
55
"github.com/MonkyMars/PWS/api/middleware"
66
"github.com/gofiber/fiber/v3"
77
)
@@ -12,5 +12,8 @@ func SetupFileRoutes(app *fiber.App) {
1212
files.Post("/upload/single", internal_files.UploadSingleFile)
1313
files.Post("/upload/multiple", internal_files.UploadMultipleFiles)
1414
files.Get("/:fileId", internal_files.GetSingleFile)
15-
files.Get("/subject/:subjectId", internal_files.GetFilesBySubject)
15+
files.Get("/subject/:subjectId/folder/:folderId", internal_files.GetFilesBySubject)
16+
17+
folders := app.Group("/folders")
18+
folders.Get("/subject/:subjectId/folder/:parentId", internal_files.GetFoldersBySubjectParent)
1619
}

0 commit comments

Comments
 (0)