diff --git a/backend/internal/routes/media.go b/backend/internal/routes/media.go index 78c6ed1..c9ae290 100644 --- a/backend/internal/routes/media.go +++ b/backend/internal/routes/media.go @@ -39,12 +39,27 @@ func RegisterMediaRoutes(rg *gin.RouterGroup) { media.GET("/getAllMediaInAlbum", func(c *gin.Context) { accessToken := c.GetHeader("Authorization") albumID := c.Query("albumId") - media, err := services.GetAllMediaInAlbum(albumID, accessToken) + isPublic, err := services.IsAlbumPublic(albumID) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } - c.JSON(http.StatusOK, gin.H{"media": media}) + if isPublic { + media, err := services.GetAllMediaInPublicAlbum(albumID) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{"media": media}) + return + } else { + media, err := services.GetAllMediaInAlbum(albumID, accessToken) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{"media": media}) + } }) media.GET("/:albumId/:mediaId", func(c *gin.Context) { albumID := c.Param("albumId") @@ -52,6 +67,20 @@ func RegisterMediaRoutes(rg *gin.RouterGroup) { if albumID == "root" { albumID = "" } + isPublic, err := services.IsAlbumPublic(albumID) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + if isPublic { + mediaData, err := services.GetMedia(albumID, mediaID) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + c.File(mediaData.Path) + return + } accessToken := c.GetHeader("Authorization") userID, err := services.ValidateAccessToken(accessToken) if err != nil { diff --git a/backend/internal/services/album.go b/backend/internal/services/album.go index d47aad5..9e7658d 100644 --- a/backend/internal/services/album.go +++ b/backend/internal/services/album.go @@ -38,9 +38,9 @@ func GetAlbumsInParent(parentID string, authToken string) ([]models.Album, error if album.Private { accessLevel, err := CheckUserAlbumAccess(userID, album.ID) if err != nil { - return []models.Album{}, err + continue // if user is not found, assume user is guest } - if accessLevel < 1 { + if accessLevel < 0 { continue } } @@ -139,3 +139,15 @@ func GetIDFromPath(path string) (string, error) { return currentParentID, nil } + +func IsAlbumPublic(albumID string) (bool, error) { + if albumID == "" { + return true, nil + } + album := models.Album{} + result := db.GetDB().First(&album, "id = ?", albumID) + if result.Error != nil { + return false, result.Error + } + return !album.Private, nil +} diff --git a/backend/internal/services/media.go b/backend/internal/services/media.go index 3559a01..382b20c 100644 --- a/backend/internal/services/media.go +++ b/backend/internal/services/media.go @@ -83,6 +83,15 @@ func GetAllMediaInAlbum(albumID string, accessToken string) ([]models.Media, err return media, nil } +func GetAllMediaInPublicAlbum(albumID string) ([]models.Media, error) { + media := []models.Media{} + result := db.GetDB().Where("album_id = ?", albumID).Find(&media) + if result.Error != nil { + return []models.Media{}, result.Error + } + return media, nil +} + func GetMedia(albumID string, mediaID string) (models.Media, error) { media := models.Media{} result := db.GetDB().First(&media, "album_id = ? AND id = ?", albumID, mediaID) diff --git a/frontend/src/components/NavBar.jsx b/frontend/src/components/NavBar.jsx index 7da4522..47f7b8d 100644 --- a/frontend/src/components/NavBar.jsx +++ b/frontend/src/components/NavBar.jsx @@ -7,7 +7,7 @@ export default function NavBar({ path }) { const [open, setOpen] = useState(false); const { user, logout } = useAccount(); return ( -