lms-backend/modules/utils/utils.go

131 lines
2.8 KiB
Go

package utils
import (
"crypto/rand"
"fmt"
"math/big"
"os"
"time"
"github.com/gofiber/fiber/v2"
"github.com/rs/zerolog/log"
"lms.de/backend/modules/config"
"lms.de/backend/modules/database"
"lms.de/backend/modules/structs"
)
func GetXAuhorizationHeader(c *fiber.Ctx) string {
// check if header is set
if len(c.GetReqHeaders()[HeaderXAuthorization]) == 0 {
return ""
}
return c.GetReqHeaders()[HeaderXAuthorization][0]
}
func GetXApiKeyHeader(c *fiber.Ctx) string {
// check if header is set
if len(c.GetReqHeaders()[HeaderXApiKey]) == 0 {
return ""
}
return c.GetReqHeaders()[HeaderXApiKey][0]
}
func GetSessionExpiresAtTime() time.Time {
return time.Now().Add(time.Second * SessionExpiresAtTime)
}
func IsPasswordLengthValid(password string) bool {
lenPassword := len(password)
if lenPassword < MinPassword || lenPassword > MaxPassword {
log.Error().Msg("Password length not valid")
return false
}
return true
}
// generates a random subdomain and check if it is already in use
func GenerateSubdomain() string {
var subdomain string
var err error
for {
subdomain, err = GenerateCode(6)
if err != nil {
log.Error().Msg("Failed to generate subdomain")
return ""
}
if !IsSubdomainAlreadyInUse(subdomain) {
break
}
log.Info().Msg("Subdomain already in use, generating new one")
}
return subdomain
}
func IsSubdomainAlreadyInUse(subdomain string) bool {
var organization structs.Organization
if err := database.DB.Where("subdomain = ?", subdomain).First(&organization).Error; err != nil {
return false
}
return true
}
func GenerateCode(codeLength int) (string, error) {
var letters = "abcdefghijklmnopqrstuvwxyz"
r := make([]byte, codeLength)
for i := 0; i < codeLength; i++ {
num, err := rand.Int(rand.Reader, big.NewInt(int64(len(letters))))
if err != nil {
log.Error().Msgf("Failed to session: %v", err)
return "", err
}
r[i] = letters[num.Int64()]
}
return string(r), nil
}
func IsFileTypeAllowed(contentType string, allowedContentTypes []string) bool {
for _, aType := range allowedContentTypes {
if aType == contentType {
return true
}
}
return false
}
func DeleteFile(filePath string) {
os.Remove(filePath)
}
func CreateFolderStructureIfNotExists(folderPath string) {
if _, err := os.Stat(folderPath); os.IsNotExist(err) {
if err := os.MkdirAll(folderPath, os.ModePerm); err != nil {
log.Error().Msgf("Failed to create folder structure, err: %v", err)
}
}
}
// GetFullImagePath returns the database path and the public path for the image
func GetFullImagePath(organizationId string, lessonId string) (databasePath string, publicPath string) {
return fmt.Sprintf(
"o/%s/l/%s/", organizationId, lessonId),
fmt.Sprintf(
"%s/o/%s/l/%s/", config.Cfg.FolderPaths.PublicStatic, organizationId, lessonId)
}