mirror of
https://github.com/wisplite/raster.git
synced 2026-05-01 06:32:44 -05:00
add access token validation logic and some media stuff
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
@@ -22,3 +23,15 @@ func CreateAccessToken(userID string) (models.AccessToken, error) {
|
||||
}
|
||||
return accessToken, nil
|
||||
}
|
||||
|
||||
func ValidateAccessToken(accessToken string) (string, error) {
|
||||
accessTokenModel := models.AccessToken{}
|
||||
result := db.GetDB().First(&accessTokenModel, "token = ?", accessToken)
|
||||
if result.Error != nil {
|
||||
return "", result.Error
|
||||
}
|
||||
if accessTokenModel.Expires.Before(time.Now()) {
|
||||
return "", fmt.Errorf("access token expired")
|
||||
}
|
||||
return accessTokenModel.UserID, nil
|
||||
}
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/wisplite/raster/internal/db"
|
||||
"github.com/wisplite/raster/internal/models"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func GetPublicAlbums() ([]models.Album, error) {
|
||||
@@ -23,3 +27,51 @@ func GetAlbum(id string, authToken string) (models.Album, error) {
|
||||
}
|
||||
return album, nil
|
||||
}
|
||||
|
||||
func CreateAlbum(accessToken string, title string, description string, parentID string) (models.Album, error) {
|
||||
userID, err := ValidateAccessToken(accessToken)
|
||||
if err != nil {
|
||||
return models.Album{}, err
|
||||
}
|
||||
if userID == "" {
|
||||
return models.Album{}, fmt.Errorf("invalid access token")
|
||||
}
|
||||
accessLevel, err := CheckUserAlbumAccess(userID, parentID)
|
||||
if err != nil {
|
||||
return models.Album{}, err
|
||||
}
|
||||
if accessLevel < 2 {
|
||||
return models.Album{}, fmt.Errorf("user does not have permission to create albums in this parent")
|
||||
}
|
||||
albumID := uuid.New().String()
|
||||
album := models.Album{
|
||||
ID: albumID,
|
||||
Title: title,
|
||||
Description: description,
|
||||
ParentID: parentID,
|
||||
}
|
||||
result := db.GetDB().Create(&album)
|
||||
if result.Error != nil {
|
||||
return models.Album{}, result.Error
|
||||
}
|
||||
return album, nil
|
||||
}
|
||||
|
||||
func CheckUserAlbumAccess(userID string, albumID string) (int, error) {
|
||||
userAccess := models.UserAccess{}
|
||||
result := db.GetDB().First(&userAccess, "user_id = ? AND album_id = ?", userID, albumID)
|
||||
if result.Error != nil {
|
||||
if result.Error == gorm.ErrRecordNotFound {
|
||||
userData, err := GetUserByID(userID)
|
||||
if err != nil {
|
||||
return -1, err
|
||||
}
|
||||
if userData.IsAdmin || userData.IsRoot {
|
||||
return 4, nil // Admin access
|
||||
}
|
||||
return -1, nil // No access
|
||||
}
|
||||
return -1, result.Error
|
||||
}
|
||||
return userAccess.AccessLevel, nil
|
||||
}
|
||||
|
||||
@@ -97,3 +97,12 @@ func GetUserData(authToken string) (models.User, error) {
|
||||
}
|
||||
return userData, nil
|
||||
}
|
||||
|
||||
func GetUserByID(userID string) (models.User, error) {
|
||||
user := models.User{}
|
||||
result := db.GetDB().First(&user, "id = ?", userID)
|
||||
if result.Error != nil {
|
||||
return models.User{}, result.Error
|
||||
}
|
||||
return user, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user