refactor: move logger to its own package

This commit is contained in:
Derrick Hammer 2023-05-22 19:05:38 -04:00
parent 6d5b9d880b
commit 7845f95776
Signed by: pcfreak30
GPG Key ID: C997C339BE476FF2
8 changed files with 99 additions and 93 deletions

View File

@ -5,8 +5,8 @@ import (
"encoding/hex" "encoding/hex"
"errors" "errors"
"git.lumeweb.com/LumeWeb/portal/db" "git.lumeweb.com/LumeWeb/portal/db"
"git.lumeweb.com/LumeWeb/portal/logger"
"git.lumeweb.com/LumeWeb/portal/model" "git.lumeweb.com/LumeWeb/portal/model"
"git.lumeweb.com/LumeWeb/portal/shared"
_validator "git.lumeweb.com/LumeWeb/portal/validator" _validator "git.lumeweb.com/LumeWeb/portal/validator"
"github.com/go-playground/validator/v10" "github.com/go-playground/validator/v10"
"github.com/kataras/iris/v12" "github.com/kataras/iris/v12"
@ -59,7 +59,7 @@ func hashPassword(password string) (string, error) {
// Generate a new bcrypt hash from the provided password. // Generate a new bcrypt hash from the provided password.
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil { if err != nil {
shared.GetLogger().Error("failed to hash password", zap.Error(err)) logger.Get().Error("failed to hash password", zap.Error(err))
return "", err return "", err
} }
@ -71,7 +71,7 @@ func (a *AccountController) PostRegister() {
var r RegisterRequest var r RegisterRequest
if err := a.Ctx.ReadJSON(&r); err != nil { if err := a.Ctx.ReadJSON(&r); err != nil {
shared.GetLogger().Debug("failed to parse request", zap.Error(err)) logger.Get().Debug("failed to parse request", zap.Error(err))
a.Ctx.StopWithError(iris.StatusBadRequest, err) a.Ctx.StopWithError(iris.StatusBadRequest, err)
return return
} }
@ -80,13 +80,13 @@ func (a *AccountController) PostRegister() {
existingAccount := model.Account{} existingAccount := model.Account{}
err := db.Get().Where("email = ?", r.Email).First(&existingAccount).Error err := db.Get().Where("email = ?", r.Email).First(&existingAccount).Error
if err == nil { if err == nil {
shared.GetLogger().Debug("account with email already exists", zap.Error(err), zap.String("email", r.Email)) logger.Get().Debug("account with email already exists", zap.Error(err), zap.String("email", r.Email))
// An account with the same email address already exists. // An account with the same email address already exists.
// Return an error response to the client. // Return an error response to the client.
a.Ctx.StopWithError(iris.StatusConflict, errors.New("an account with this email address already exists")) a.Ctx.StopWithError(iris.StatusConflict, errors.New("an account with this email address already exists"))
return return
} else if !errors.Is(err, gorm.ErrRecordNotFound) { } else if !errors.Is(err, gorm.ErrRecordNotFound) {
shared.GetLogger().Error("error querying accounts", zap.Error(err), zap.String("email", r.Email)) logger.Get().Error("error querying accounts", zap.Error(err), zap.String("email", r.Email))
// An unexpected error occurred while querying the database. // An unexpected error occurred while querying the database.
// Return an error response to the client. // Return an error response to the client.
a.Ctx.StopWithError(iris.StatusInternalServerError, err) a.Ctx.StopWithError(iris.StatusInternalServerError, err)
@ -125,7 +125,7 @@ func (a *AccountController) PostRegister() {
return nil return nil
}) })
if err != nil { if err != nil {
shared.GetLogger().Error("failed to create account", zap.Error(err)) logger.Get().Error("failed to create account", zap.Error(err))
a.Ctx.StopWithError(iris.StatusInternalServerError, err) a.Ctx.StopWithError(iris.StatusInternalServerError, err)
return return
} }

View File

@ -6,8 +6,8 @@ import (
"errors" "errors"
"fmt" "fmt"
"git.lumeweb.com/LumeWeb/portal/db" "git.lumeweb.com/LumeWeb/portal/db"
"git.lumeweb.com/LumeWeb/portal/logger"
"git.lumeweb.com/LumeWeb/portal/model" "git.lumeweb.com/LumeWeb/portal/model"
"git.lumeweb.com/LumeWeb/portal/shared"
"github.com/joomcode/errorx" "github.com/joomcode/errorx"
"github.com/kataras/iris/v12" "github.com/kataras/iris/v12"
"github.com/kataras/jwt" "github.com/kataras/jwt"
@ -75,7 +75,7 @@ func generateToken(maxAge time.Duration) (string, error) {
token, err := jwt.Sign(jwt.HS256, sharedKey, claim, jwt.MaxAge(maxAge)) token, err := jwt.Sign(jwt.HS256, sharedKey, claim, jwt.MaxAge(maxAge))
if err != nil { if err != nil {
shared.GetLogger().Error("failed to sign jwt", zap.Error(err)) logger.Get().Error("failed to sign jwt", zap.Error(err))
return "", err return "", err
} }
@ -86,7 +86,7 @@ func generateAndSaveLoginToken(accountID uint, maxAge time.Duration) (string, er
// Generate a JWT token for the authenticated user. // Generate a JWT token for the authenticated user.
token, err := generateToken(maxAge) token, err := generateToken(maxAge)
if err != nil { if err != nil {
shared.GetLogger().Error("failed to generate token", zap.Error(err)) logger.Get().Error("failed to generate token", zap.Error(err))
return "", fmt.Errorf("failed to generate token: %s", err) return "", fmt.Errorf("failed to generate token: %s", err)
} }
@ -104,7 +104,7 @@ func generateAndSaveLoginToken(accountID uint, maxAge time.Duration) (string, er
if err := db.Get().Create(&session).Error; err != nil { if err := db.Get().Create(&session).Error; err != nil {
msg := "failed to save token" msg := "failed to save token"
shared.GetLogger().Error(msg, zap.Error(err)) logger.Get().Error(msg, zap.Error(err))
return "", errorx.Decorate(err, msg) return "", errorx.Decorate(err, msg)
} }
@ -115,7 +115,7 @@ func generateAndSaveChallengeToken(accountID uint, maxAge time.Duration) (string
// Generate a JWT token for the authenticated user. // Generate a JWT token for the authenticated user.
token, err := generateToken(maxAge) token, err := generateToken(maxAge)
if err != nil { if err != nil {
shared.GetLogger().Error("failed to generate token", zap.Error(err)) logger.Get().Error("failed to generate token", zap.Error(err))
return "", fmt.Errorf("failed to generate token: %s", err) return "", fmt.Errorf("failed to generate token: %s", err)
} }
@ -133,7 +133,7 @@ func generateAndSaveChallengeToken(accountID uint, maxAge time.Duration) (string
if err := db.Get().Create(&keyChallenge).Error; err != nil { if err := db.Get().Create(&keyChallenge).Error; err != nil {
msg := "failed to save token" msg := "failed to save token"
shared.GetLogger().Error(msg, zap.Error(err)) logger.Get().Error(msg, zap.Error(err))
return "", errorx.Decorate(err, msg) return "", errorx.Decorate(err, msg)
} }
@ -146,7 +146,7 @@ func (a *AuthController) PostLogin() {
// Read the login request from the client. // Read the login request from the client.
if err := a.Ctx.ReadJSON(&r); err != nil { if err := a.Ctx.ReadJSON(&r); err != nil {
shared.GetLogger().Debug("failed to parse request", zap.Error(err)) logger.Get().Debug("failed to parse request", zap.Error(err))
a.Ctx.StopWithError(iris.StatusBadRequest, err) a.Ctx.StopWithError(iris.StatusBadRequest, err)
return return
} }
@ -155,7 +155,7 @@ func (a *AuthController) PostLogin() {
account := model.Account{} account := model.Account{}
if err := db.Get().Where("email = ?", r.Email).First(&account).Error; err != nil { if err := db.Get().Where("email = ?", r.Email).First(&account).Error; err != nil {
msg := "invalid email or password" msg := "invalid email or password"
shared.GetLogger().Debug(msg, zap.Error(err)) logger.Get().Debug(msg, zap.Error(err))
a.Ctx.StopWithError(iris.StatusBadRequest, errors.New(msg)) a.Ctx.StopWithError(iris.StatusBadRequest, errors.New(msg))
return return
} }
@ -163,7 +163,7 @@ func (a *AuthController) PostLogin() {
// Verify the provided password against the hashed password stored in the database. // Verify the provided password against the hashed password stored in the database.
if err := verifyPassword(*account.Password, r.Password); err != nil { if err := verifyPassword(*account.Password, r.Password); err != nil {
msg := "invalid email or password" msg := "invalid email or password"
shared.GetLogger().Debug(msg, zap.Error(err)) logger.Get().Debug(msg, zap.Error(err))
a.Ctx.StopWithError(iris.StatusBadRequest, errors.New(msg)) a.Ctx.StopWithError(iris.StatusBadRequest, errors.New(msg))
return return
} }
@ -171,7 +171,7 @@ func (a *AuthController) PostLogin() {
// Generate a JWT token for the authenticated user. // Generate a JWT token for the authenticated user.
token, err := generateAndSaveLoginToken(account.ID, 24*time.Hour) token, err := generateAndSaveLoginToken(account.ID, 24*time.Hour)
if err != nil { if err != nil {
shared.GetLogger().Debug("failed to generate token", zap.Error(err)) logger.Get().Debug("failed to generate token", zap.Error(err))
a.Ctx.StopWithError(iris.StatusInternalServerError, fmt.Errorf("failed to generate token: %s", err)) a.Ctx.StopWithError(iris.StatusInternalServerError, fmt.Errorf("failed to generate token: %s", err))
return return
} }
@ -179,7 +179,7 @@ func (a *AuthController) PostLogin() {
// Return the JWT token to the client. // Return the JWT token to the client.
err = a.Ctx.JSON(&LoginResponse{Token: token}) err = a.Ctx.JSON(&LoginResponse{Token: token})
if err != nil { if err != nil {
shared.GetLogger().Error("failed to generate response", zap.Error(err)) logger.Get().Error("failed to generate response", zap.Error(err))
} }
} }
@ -189,7 +189,7 @@ func (a *AuthController) PostPubkeyChallenge() {
// Read the login request from the client. // Read the login request from the client.
if err := a.Ctx.ReadJSON(&r); err != nil { if err := a.Ctx.ReadJSON(&r); err != nil {
shared.GetLogger().Debug("failed to parse request", zap.Error(err)) logger.Get().Debug("failed to parse request", zap.Error(err))
a.Ctx.StopWithError(iris.StatusBadRequest, err) a.Ctx.StopWithError(iris.StatusBadRequest, err)
return return
} }
@ -221,7 +221,7 @@ func (a *AuthController) PostPubkeyLogin() {
// Read the key login request from the client. // Read the key login request from the client.
if err := a.Ctx.ReadJSON(&r); err != nil { if err := a.Ctx.ReadJSON(&r); err != nil {
shared.GetLogger().Debug("failed to parse request", zap.Error(err)) logger.Get().Debug("failed to parse request", zap.Error(err))
a.Ctx.StopWithError(iris.StatusBadRequest, err) a.Ctx.StopWithError(iris.StatusBadRequest, err)
return return
} }
@ -230,7 +230,7 @@ func (a *AuthController) PostPubkeyLogin() {
challenge := model.KeyChallenge{} challenge := model.KeyChallenge{}
if err := db.Get().Where("challenge = ?", r.Challenge).Preload("Key").First(&challenge).Error; err != nil { if err := db.Get().Where("challenge = ?", r.Challenge).Preload("Key").First(&challenge).Error; err != nil {
msg := "invalid key challenge" msg := "invalid key challenge"
shared.GetLogger().Debug(msg, zap.Error(err), zap.String("challenge", r.Challenge)) logger.Get().Debug(msg, zap.Error(err), zap.String("challenge", r.Challenge))
a.Ctx.StopWithError(iris.StatusBadRequest, errorx.RejectedOperation.New(msg)) a.Ctx.StopWithError(iris.StatusBadRequest, errorx.RejectedOperation.New(msg))
return return
} }
@ -238,7 +238,7 @@ func (a *AuthController) PostPubkeyLogin() {
verifiedToken, err := jwt.Verify(jwt.HS256, sharedKey, []byte(r.Challenge), blocklist) verifiedToken, err := jwt.Verify(jwt.HS256, sharedKey, []byte(r.Challenge), blocklist)
if err != nil { if err != nil {
msg := "invalid key challenge" msg := "invalid key challenge"
shared.GetLogger().Debug(msg, zap.Error(err), zap.String("challenge", r.Challenge)) logger.Get().Debug(msg, zap.Error(err), zap.String("challenge", r.Challenge))
a.Ctx.StopWithError(iris.StatusBadRequest, errorx.RejectedOperation.New(msg)) a.Ctx.StopWithError(iris.StatusBadRequest, errorx.RejectedOperation.New(msg))
return return
} }
@ -246,7 +246,7 @@ func (a *AuthController) PostPubkeyLogin() {
rawPubKey, err := hex.DecodeString(r.Pubkey) rawPubKey, err := hex.DecodeString(r.Pubkey)
if err != nil { if err != nil {
msg := "invalid pubkey" msg := "invalid pubkey"
shared.GetLogger().Debug(msg, zap.Error(err), zap.String("pubkey", r.Pubkey)) logger.Get().Debug(msg, zap.Error(err), zap.String("pubkey", r.Pubkey))
a.Ctx.StopWithError(iris.StatusBadRequest, errorx.RejectedOperation.New(msg)) a.Ctx.StopWithError(iris.StatusBadRequest, errorx.RejectedOperation.New(msg))
return return
} }
@ -254,7 +254,7 @@ func (a *AuthController) PostPubkeyLogin() {
rawSignature, err := hex.DecodeString(r.Signature) rawSignature, err := hex.DecodeString(r.Signature)
if err != nil { if err != nil {
msg := "invalid signature" msg := "invalid signature"
shared.GetLogger().Debug(msg, zap.Error(err), zap.String("signature", r.Signature)) logger.Get().Debug(msg, zap.Error(err), zap.String("signature", r.Signature))
a.Ctx.StopWithError(iris.StatusBadRequest, errorx.RejectedOperation.New(msg)) a.Ctx.StopWithError(iris.StatusBadRequest, errorx.RejectedOperation.New(msg))
return return
} }
@ -264,7 +264,7 @@ func (a *AuthController) PostPubkeyLogin() {
// Verify the challenge signature. // Verify the challenge signature.
if !ed25519.Verify(publicKeyDecoded, []byte(r.Challenge), rawSignature) { if !ed25519.Verify(publicKeyDecoded, []byte(r.Challenge), rawSignature) {
msg := "invalid challenge" msg := "invalid challenge"
shared.GetLogger().Debug(msg, zap.Error(err), zap.String("challenge", r.Challenge)) logger.Get().Debug(msg, zap.Error(err), zap.String("challenge", r.Challenge))
a.Ctx.StopWithError(iris.StatusBadRequest, errorx.RejectedOperation.New(msg)) a.Ctx.StopWithError(iris.StatusBadRequest, errorx.RejectedOperation.New(msg))
} }
@ -278,14 +278,14 @@ func (a *AuthController) PostPubkeyLogin() {
err = blocklist.InvalidateToken(verifiedToken.Token, verifiedToken.StandardClaims) err = blocklist.InvalidateToken(verifiedToken.Token, verifiedToken.StandardClaims)
if err != nil { if err != nil {
msg := "failed to invalidate token" msg := "failed to invalidate token"
shared.GetLogger().Error(msg, zap.Error(err), zap.String("token", hex.EncodeToString(verifiedToken.Token))) logger.Get().Error(msg, zap.Error(err), zap.String("token", hex.EncodeToString(verifiedToken.Token)))
a.Ctx.StopWithError(iris.StatusInternalServerError, errorx.RejectedOperation.Wrap(err, msg)) a.Ctx.StopWithError(iris.StatusInternalServerError, errorx.RejectedOperation.Wrap(err, msg))
return return
} }
if err := db.Get().Delete(&challenge).Error; err != nil { if err := db.Get().Delete(&challenge).Error; err != nil {
msg := "failed to delete key challenge" msg := "failed to delete key challenge"
shared.GetLogger().Error(msg, zap.Error(err), zap.Any("key_challenge", challenge)) logger.Get().Error(msg, zap.Error(err), zap.Any("key_challenge", challenge))
a.Ctx.StopWithError(iris.StatusBadRequest, errorx.RejectedOperation.New(msg)) a.Ctx.StopWithError(iris.StatusBadRequest, errorx.RejectedOperation.New(msg))
return return
} }
@ -293,7 +293,7 @@ func (a *AuthController) PostPubkeyLogin() {
// Return the JWT token to the client. // Return the JWT token to the client.
err = a.Ctx.JSON(&LoginResponse{Token: token}) err = a.Ctx.JSON(&LoginResponse{Token: token})
if err != nil { if err != nil {
shared.GetLogger().Error("failed to create response", zap.Error(err)) logger.Get().Error("failed to create response", zap.Error(err))
} }
} }
@ -304,7 +304,7 @@ func (a *AuthController) PostLogout() {
// Read the logout request from the client. // Read the logout request from the client.
if err := a.Ctx.ReadJSON(&r); err != nil { if err := a.Ctx.ReadJSON(&r); err != nil {
shared.GetLogger().Debug("failed to parse request", zap.Error(err)) logger.Get().Debug("failed to parse request", zap.Error(err))
a.Ctx.StopWithError(iris.StatusBadRequest, err) a.Ctx.StopWithError(iris.StatusBadRequest, err)
return return
} }
@ -313,7 +313,7 @@ func (a *AuthController) PostLogout() {
claims, err := jwt.Verify(jwt.HS256, sharedKey, []byte(r.Token), blocklist) claims, err := jwt.Verify(jwt.HS256, sharedKey, []byte(r.Token), blocklist)
if err != nil { if err != nil {
msg := "invalid token" msg := "invalid token"
shared.GetLogger().Debug(msg, zap.Error(err)) logger.Get().Debug(msg, zap.Error(err))
a.Ctx.StopWithError(iris.StatusBadRequest, errors.New(msg)) a.Ctx.StopWithError(iris.StatusBadRequest, errors.New(msg))
return return
} }
@ -321,7 +321,7 @@ func (a *AuthController) PostLogout() {
err = blocklist.InvalidateToken(claims.Token, claims.StandardClaims) err = blocklist.InvalidateToken(claims.Token, claims.StandardClaims)
if err != nil { if err != nil {
msg := "failed to invalidate token" msg := "failed to invalidate token"
shared.GetLogger().Error(msg, zap.Error(err), zap.String("token", hex.EncodeToString(claims.Token))) logger.Get().Error(msg, zap.Error(err), zap.String("token", hex.EncodeToString(claims.Token)))
a.Ctx.StopWithError(iris.StatusBadRequest, errors.New(msg)) a.Ctx.StopWithError(iris.StatusBadRequest, errors.New(msg))
return return
} }

View File

@ -3,8 +3,8 @@ package controller
import ( import (
"errors" "errors"
"git.lumeweb.com/LumeWeb/portal/cid" "git.lumeweb.com/LumeWeb/portal/cid"
"git.lumeweb.com/LumeWeb/portal/logger"
"git.lumeweb.com/LumeWeb/portal/service/files" "git.lumeweb.com/LumeWeb/portal/service/files"
"git.lumeweb.com/LumeWeb/portal/shared"
"github.com/kataras/iris/v12" "github.com/kataras/iris/v12"
"go.uber.org/zap" "go.uber.org/zap"
"io" "io"
@ -22,28 +22,28 @@ func (f *FilesController) PostUpload() {
file, meta, err := f.Ctx.FormFile("file") file, meta, err := f.Ctx.FormFile("file")
if internalErrorCustom(ctx, err, errors.New("invalid file data")) { if internalErrorCustom(ctx, err, errors.New("invalid file data")) {
shared.GetLogger().Debug("invalid file data", zap.Error(err)) logger.Get().Debug("invalid file data", zap.Error(err))
return return
} }
upload, err := files.Upload(file, meta.Size, nil) upload, err := files.Upload(file, meta.Size, nil)
if internalError(ctx, err) { if internalError(ctx, err) {
shared.GetLogger().Debug("failed uploading file", zap.Error(err)) logger.Get().Debug("failed uploading file", zap.Error(err))
return return
} }
cidString, err := cid.EncodeString(upload.Hash, uint64(meta.Size)) cidString, err := cid.EncodeString(upload.Hash, uint64(meta.Size))
if internalError(ctx, err) { if internalError(ctx, err) {
shared.GetLogger().Debug("failed creating cid", zap.Error(err)) logger.Get().Debug("failed creating cid", zap.Error(err))
return return
} }
err = ctx.JSON(&UploadResponse{Cid: cidString}) err = ctx.JSON(&UploadResponse{Cid: cidString})
if err != nil { if err != nil {
shared.GetLogger().Error("failed to create response", zap.Error(err)) logger.Get().Error("failed to create response", zap.Error(err))
} }
} }
@ -52,7 +52,7 @@ func (f *FilesController) GetDownloadBy(cidString string) {
_, err := cid.Valid(cidString) _, err := cid.Valid(cidString)
if sendError(ctx, err, iris.StatusBadRequest) { if sendError(ctx, err, iris.StatusBadRequest) {
shared.GetLogger().Debug("invalid cid", zap.Error(err)) logger.Get().Debug("invalid cid", zap.Error(err))
return return
} }
@ -60,7 +60,7 @@ func (f *FilesController) GetDownloadBy(cidString string) {
hashHex := cidObject.StringHash() hashHex := cidObject.StringHash()
download, err := files.Download(hashHex) download, err := files.Download(hashHex)
if internalError(ctx, err) { if internalError(ctx, err) {
shared.GetLogger().Debug("failed fetching file", zap.Error(err)) logger.Get().Debug("failed fetching file", zap.Error(err))
return return
} }
@ -70,7 +70,7 @@ func (f *FilesController) GetDownloadBy(cidString string) {
return err return err
}) })
if internalError(ctx, err) { if internalError(ctx, err) {
shared.GetLogger().Debug("failed streaming file", zap.Error(err)) logger.Get().Debug("failed streaming file", zap.Error(err))
} }
} }

22
logger/logger.go Normal file
View File

@ -0,0 +1,22 @@
package logger
import (
"go.uber.org/zap"
"log"
)
var logger *zap.Logger
func Init() {
newLogger, err := zap.NewProduction()
if err != nil {
log.Fatal(err)
}
logger = newLogger
}
func Get() *zap.Logger {
return logger
}

View File

@ -6,9 +6,9 @@ import (
"git.lumeweb.com/LumeWeb/portal/controller" "git.lumeweb.com/LumeWeb/portal/controller"
"git.lumeweb.com/LumeWeb/portal/db" "git.lumeweb.com/LumeWeb/portal/db"
_ "git.lumeweb.com/LumeWeb/portal/docs" _ "git.lumeweb.com/LumeWeb/portal/docs"
"git.lumeweb.com/LumeWeb/portal/logger"
"git.lumeweb.com/LumeWeb/portal/renterd" "git.lumeweb.com/LumeWeb/portal/renterd"
"git.lumeweb.com/LumeWeb/portal/service/files" "git.lumeweb.com/LumeWeb/portal/service/files"
"git.lumeweb.com/LumeWeb/portal/shared"
"git.lumeweb.com/LumeWeb/portal/tus" "git.lumeweb.com/LumeWeb/portal/tus"
"git.lumeweb.com/LumeWeb/portal/validator" "git.lumeweb.com/LumeWeb/portal/validator"
"github.com/iris-contrib/swagger" "github.com/iris-contrib/swagger"
@ -50,7 +50,7 @@ func main() {
renterd.Ready() renterd.Ready()
shared.Init() logger.Init()
files.Init() files.Init()
// Create a new Iris app instance // Create a new Iris app instance
@ -109,7 +109,7 @@ func main() {
}) })
if err != nil { if err != nil {
shared.GetLogger().Error("Failed starting webserver proof", zap.Error(err)) logger.Get().Error("Failed starting webserver proof", zap.Error(err))
} }
renterd.ShutdownComplete() renterd.ShutdownComplete()

View File

@ -8,6 +8,7 @@ import (
"fmt" "fmt"
"git.lumeweb.com/LumeWeb/portal/bao" "git.lumeweb.com/LumeWeb/portal/bao"
"git.lumeweb.com/LumeWeb/portal/db" "git.lumeweb.com/LumeWeb/portal/db"
"git.lumeweb.com/LumeWeb/portal/logger"
"git.lumeweb.com/LumeWeb/portal/model" "git.lumeweb.com/LumeWeb/portal/model"
"git.lumeweb.com/LumeWeb/portal/renterd" "git.lumeweb.com/LumeWeb/portal/renterd"
"git.lumeweb.com/LumeWeb/portal/shared" "git.lumeweb.com/LumeWeb/portal/shared"
@ -32,13 +33,13 @@ func Upload(r io.ReadSeeker, size int64, hash []byte) (model.Upload, error) {
tree, hashBytes, err := bao.ComputeTree(r, size) tree, hashBytes, err := bao.ComputeTree(r, size)
if err != nil { if err != nil {
shared.GetLogger().Error("Failed to hash file", zap.Error(err)) logger.Get().Error("Failed to hash file", zap.Error(err))
return upload, err return upload, err
} }
if hash != nil { if hash != nil {
if bytes.Compare(hashBytes[:], hash) != 0 { if bytes.Compare(hashBytes[:], hash) != 0 {
shared.GetLogger().Error("File hash does not match provided file hash") logger.Get().Error("File hash does not match provided file hash")
return upload, err return upload, err
} }
} }
@ -55,12 +56,12 @@ func Upload(r io.ReadSeeker, size int64, hash []byte) (model.Upload, error) {
if (result.Error != nil && result.Error.Error() != "record not found") || result.RowsAffected > 0 { if (result.Error != nil && result.Error.Error() != "record not found") || result.RowsAffected > 0 {
err := result.Row().Scan(&upload) err := result.Row().Scan(&upload)
if err != nil { if err != nil {
shared.GetLogger().Error("Failed to query uploads table", zap.Error(err)) logger.Get().Error("Failed to query uploads table", zap.Error(err))
return upload, err return upload, err
} }
if result.RowsAffected > 0 && upload.ID > 0 { if result.RowsAffected > 0 && upload.ID > 0 {
shared.GetLogger().Info("Upload already exists") logger.Get().Info("Upload already exists")
return upload, nil return upload, nil
} }
} }
@ -68,7 +69,7 @@ func Upload(r io.ReadSeeker, size int64, hash []byte) (model.Upload, error) {
objectExistsResult, err := client.R().Get(getBusObjectUrl(hashHex)) objectExistsResult, err := client.R().Get(getBusObjectUrl(hashHex))
if err != nil { if err != nil {
shared.GetLogger().Error("Failed query object", zap.Error(err)) logger.Get().Error("Failed query object", zap.Error(err))
return upload, err return upload, err
} }
@ -77,7 +78,7 @@ func Upload(r io.ReadSeeker, size int64, hash []byte) (model.Upload, error) {
if objectStatusCode == 500 { if objectStatusCode == 500 {
bodyErr := objectExistsResult.String() bodyErr := objectExistsResult.String()
if !strings.Contains(bodyErr, "no slabs found") { if !strings.Contains(bodyErr, "no slabs found") {
shared.GetLogger().Error("Failed fetching object", zap.String("error", objectExistsResult.String())) logger.Get().Error("Failed fetching object", zap.String("error", objectExistsResult.String()))
return upload, errors.New(fmt.Sprintf("error fetching file: %s", objectExistsResult.String())) return upload, errors.New(fmt.Sprintf("error fetching file: %s", objectExistsResult.String()))
} }
@ -87,7 +88,7 @@ func Upload(r io.ReadSeeker, size int64, hash []byte) (model.Upload, error) {
proofExistsResult, err := client.R().Get(getBusProofUrl(hashHex)) proofExistsResult, err := client.R().Get(getBusProofUrl(hashHex))
if err != nil { if err != nil {
shared.GetLogger().Error("Failed query object proof", zap.Error(err)) logger.Get().Error("Failed query object proof", zap.Error(err))
return upload, err return upload, err
} }
@ -96,7 +97,7 @@ func Upload(r io.ReadSeeker, size int64, hash []byte) (model.Upload, error) {
if proofStatusCode == 500 { if proofStatusCode == 500 {
bodyErr := proofExistsResult.String() bodyErr := proofExistsResult.String()
if !strings.Contains(bodyErr, "no slabs found") { if !strings.Contains(bodyErr, "no slabs found") {
shared.GetLogger().Error("Failed fetching object proof", zap.String("error", proofExistsResult.String())) logger.Get().Error("Failed fetching object proof", zap.String("error", proofExistsResult.String()))
return upload, errors.New(fmt.Sprintf("error fetching file proof: %s", proofExistsResult.String())) return upload, errors.New(fmt.Sprintf("error fetching file proof: %s", proofExistsResult.String()))
} }
@ -105,20 +106,20 @@ func Upload(r io.ReadSeeker, size int64, hash []byte) (model.Upload, error) {
if objectStatusCode != 404 && proofStatusCode != 404 { if objectStatusCode != 404 && proofStatusCode != 404 {
msg := "file already exists in network, but missing in database" msg := "file already exists in network, but missing in database"
shared.GetLogger().Error(msg) logger.Get().Error(msg)
return upload, errors.New(msg) return upload, errors.New(msg)
} }
ret, err := client.R().SetBody(r).Put(getWorkerObjectUrl(hashHex)) ret, err := client.R().SetBody(r).Put(getWorkerObjectUrl(hashHex))
if ret.StatusCode() != 200 { if ret.StatusCode() != 200 {
shared.GetLogger().Error("Failed uploading object", zap.String("error", ret.String())) logger.Get().Error("Failed uploading object", zap.String("error", ret.String()))
err = errors.New(ret.String()) err = errors.New(ret.String())
return upload, err return upload, err
} }
ret, err = client.R().SetBody(tree).Put(getWorkerProofUrl(hashHex)) ret, err = client.R().SetBody(tree).Put(getWorkerProofUrl(hashHex))
if ret.StatusCode() != 200 { if ret.StatusCode() != 200 {
shared.GetLogger().Error("Failed uploading proof", zap.String("error", ret.String())) logger.Get().Error("Failed uploading proof", zap.String("error", ret.String()))
err = errors.New(ret.String()) err = errors.New(ret.String())
return upload, err return upload, err
} }
@ -128,7 +129,7 @@ func Upload(r io.ReadSeeker, size int64, hash []byte) (model.Upload, error) {
} }
if err = db.Get().Create(&upload).Error; err != nil { if err = db.Get().Create(&upload).Error; err != nil {
shared.GetLogger().Error("Failed adding upload to db", zap.Error(err)) logger.Get().Error("Failed adding upload to db", zap.Error(err))
return upload, err return upload, err
} }
@ -141,7 +142,7 @@ func Download(hash string) (io.Reader, error) {
if uploadItem.Err() == nil { if uploadItem.Err() == nil {
fetch, err := client.R().SetDoNotParseResponse(true).Get(fmt.Sprintf("/worker/objects/%s", hash)) fetch, err := client.R().SetDoNotParseResponse(true).Get(fmt.Sprintf("/worker/objects/%s", hash))
if err != nil { if err != nil {
shared.GetLogger().Error("Failed downloading object", zap.Error(err)) logger.Get().Error("Failed downloading object", zap.Error(err))
return nil, err return nil, err
} }
@ -150,25 +151,25 @@ func Download(hash string) (io.Reader, error) {
var tusData model.Tus var tusData model.Tus
err := tusItem.Scan(&tusData) err := tusItem.Scan(&tusData)
if err != nil { if err != nil {
shared.GetLogger().Error("Failed querying upload from db", zap.Error(err)) logger.Get().Error("Failed querying upload from db", zap.Error(err))
return nil, err return nil, err
} }
upload, err := shared.GetTusStore().GetUpload(context.Background(), tusData.UploadID) upload, err := shared.GetTusStore().GetUpload(context.Background(), tusData.UploadID)
if err != nil { if err != nil {
shared.GetLogger().Error("Failed querying tus upload", zap.Error(err)) logger.Get().Error("Failed querying tus upload", zap.Error(err))
return nil, err return nil, err
} }
reader, err := upload.GetReader(context.Background()) reader, err := upload.GetReader(context.Background())
if err != nil { if err != nil {
shared.GetLogger().Error("Failed reading tus upload", zap.Error(err)) logger.Get().Error("Failed reading tus upload", zap.Error(err))
return nil, err return nil, err
} }
return reader, nil return reader, nil
} else { } else {
shared.GetLogger().Error("invalid file") logger.Get().Error("invalid file")
return nil, errors.New("invalid file") return nil, errors.New("invalid file")
} }
} }

View File

@ -1,18 +1,15 @@
package shared package shared
import ( import (
"git.lumeweb.com/LumeWeb/portal/tusstore"
"github.com/golang-queue/queue" "github.com/golang-queue/queue"
"github.com/tus/tusd/pkg/filestore"
tusd "github.com/tus/tusd/pkg/handler" tusd "github.com/tus/tusd/pkg/handler"
"go.uber.org/zap"
_ "go.uber.org/zap" _ "go.uber.org/zap"
"log"
) )
var tusQueue *queue.Queue var tusQueue *queue.Queue
var tusStore *filestore.FileStore var tusStore *tusstore.DbFileStore
var tusComposer *tusd.StoreComposer var tusComposer *tusd.StoreComposer
var logger *zap.Logger
func SetTusQueue(q *queue.Queue) { func SetTusQueue(q *queue.Queue) {
tusQueue = q tusQueue = q
@ -22,11 +19,11 @@ func GetTusQueue() *queue.Queue {
return tusQueue return tusQueue
} }
func SetTusStore(s *filestore.FileStore) { func SetTusStore(s *tusstore.DbFileStore) {
tusStore = s tusStore = s
} }
func GetTusStore() *filestore.FileStore { func GetTusStore() *tusstore.DbFileStore {
return tusStore return tusStore
} }
@ -37,17 +34,3 @@ func SetTusComposer(c *tusd.StoreComposer) {
func GetTusComposer() *tusd.StoreComposer { func GetTusComposer() *tusd.StoreComposer {
return tusComposer return tusComposer
} }
func Init() {
newLogger, err := zap.NewProduction()
if err != nil {
log.Fatal(err)
}
logger = newLogger
}
func GetLogger() *zap.Logger {
return logger
}

View File

@ -7,11 +7,11 @@ import (
"errors" "errors"
"git.lumeweb.com/LumeWeb/portal/cid" "git.lumeweb.com/LumeWeb/portal/cid"
"git.lumeweb.com/LumeWeb/portal/db" "git.lumeweb.com/LumeWeb/portal/db"
"git.lumeweb.com/LumeWeb/portal/logger"
"git.lumeweb.com/LumeWeb/portal/model" "git.lumeweb.com/LumeWeb/portal/model"
"git.lumeweb.com/LumeWeb/portal/service/files" "git.lumeweb.com/LumeWeb/portal/service/files"
"git.lumeweb.com/LumeWeb/portal/shared" "git.lumeweb.com/LumeWeb/portal/shared"
"github.com/golang-queue/queue" "github.com/golang-queue/queue"
"github.com/tus/tusd/pkg/filestore"
tusd "github.com/tus/tusd/pkg/handler" tusd "github.com/tus/tusd/pkg/handler"
"github.com/tus/tusd/pkg/memorylocker" "github.com/tus/tusd/pkg/memorylocker"
"go.uber.org/zap" "go.uber.org/zap"
@ -45,7 +45,7 @@ func Init() *tusd.Handler {
if len(hash) == 0 { if len(hash) == 0 {
msg := "missing blake3-hash metadata" msg := "missing blake3-hash metadata"
shared.GetLogger().Debug(msg) logger.Get().Debug(msg)
return errors.New(msg) return errors.New(msg)
} }
@ -54,21 +54,21 @@ func Init() *tusd.Handler {
if (result.Error != nil && result.Error.Error() != "record not found") || result.RowsAffected > 0 { if (result.Error != nil && result.Error.Error() != "record not found") || result.RowsAffected > 0 {
hashBytes, err := hex.DecodeString(hash) hashBytes, err := hex.DecodeString(hash)
if err != nil { if err != nil {
shared.GetLogger().Debug("invalid hash", zap.Error(err)) logger.Get().Debug("invalid hash", zap.Error(err))
return err return err
} }
cidString, err := cid.Encode(hashBytes, uint64(hook.Upload.Size)) cidString, err := cid.Encode(hashBytes, uint64(hook.Upload.Size))
if err != nil { if err != nil {
shared.GetLogger().Debug("failed to create cid", zap.Error(err)) logger.Get().Debug("failed to create cid", zap.Error(err))
return err return err
} }
resp, err := json.Marshal(UploadResponse{Cid: cidString}) resp, err := json.Marshal(UploadResponse{Cid: cidString})
if err != nil { if err != nil {
shared.GetLogger().Error("failed to create response", zap.Error(err)) logger.Get().Error("failed to create response", zap.Error(err))
return err return err
} }
@ -84,19 +84,19 @@ func Init() *tusd.Handler {
} }
if err := db.Get().Create(tusEntry).Error; err != nil { if err := db.Get().Create(tusEntry).Error; err != nil {
shared.GetLogger().Error("failed to create tus entry", zap.Error(err)) logger.Get().Error("failed to create tus entry", zap.Error(err))
return err return err
} }
if err := shared.GetTusQueue().QueueTask(func(ctx context.Context) error { if err := shared.GetTusQueue().QueueTask(func(ctx context.Context) error {
upload, err := store.GetUpload(nil, hook.Upload.ID) upload, err := store.GetUpload(nil, hook.Upload.ID)
if err != nil { if err != nil {
shared.GetLogger().Error("failed to query tus upload", zap.Error(err)) logger.Get().Error("failed to query tus upload", zap.Error(err))
return err return err
} }
return tusWorker(&upload) return tusWorker(&upload)
}); err != nil { }); err != nil {
shared.GetLogger().Error("failed to queue tus upload", zap.Error(err)) logger.Get().Error("failed to queue tus upload", zap.Error(err))
return err return err
} }
@ -125,7 +125,7 @@ func tusStartup() {
if err := tusQueue.QueueTask(func(ctx context.Context) error { if err := tusQueue.QueueTask(func(ctx context.Context) error {
upload, err := store.GetUpload(nil, item.UploadID) upload, err := store.GetUpload(nil, item.UploadID)
if err != nil { if err != nil {
shared.GetLogger().Error("failed to query tus upload", zap.Error(err)) logger.Get().Error("failed to query tus upload", zap.Error(err))
return err return err
} }
return tusWorker(&upload) return tusWorker(&upload)
@ -138,12 +138,12 @@ func tusStartup() {
func tusWorker(upload *tusd.Upload) error { func tusWorker(upload *tusd.Upload) error {
info, err := (*upload).GetInfo(context.Background()) info, err := (*upload).GetInfo(context.Background())
if err != nil { if err != nil {
shared.GetLogger().Error("failed to query tus upload metadata", zap.Error(err)) logger.Get().Error("failed to query tus upload metadata", zap.Error(err))
return err return err
} }
file, err := (*upload).GetReader(context.Background()) file, err := (*upload).GetReader(context.Background())
if err != nil { if err != nil {
shared.GetLogger().Error("failed reading upload", zap.Error(err)) logger.Get().Error("failed reading upload", zap.Error(err))
return err return err
} }
@ -152,7 +152,7 @@ func tusWorker(upload *tusd.Upload) error {
hashBytes, err := hex.DecodeString(hashHex) hashBytes, err := hex.DecodeString(hashHex)
if err != nil { if err != nil {
shared.GetLogger().Error("failed decoding hash", zap.Error(err)) logger.Get().Error("failed decoding hash", zap.Error(err))
tErr := terminateUpload(*upload) tErr := terminateUpload(*upload)
if tErr != nil { if tErr != nil {
@ -180,14 +180,14 @@ func terminateUpload(upload tusd.Upload) error {
err := shared.GetTusComposer().Terminater.AsTerminatableUpload(upload).Terminate(context.Background()) err := shared.GetTusComposer().Terminater.AsTerminatableUpload(upload).Terminate(context.Background())
if err != nil { if err != nil {
shared.GetLogger().Error("failed deleting tus upload", zap.Error(err)) logger.Get().Error("failed deleting tus upload", zap.Error(err))
} }
tusUpload := &model.Tus{UploadID: info.ID} tusUpload := &model.Tus{UploadID: info.ID}
ret := db.Get().Where(tusUpload).First(&tusUpload) ret := db.Get().Where(tusUpload).First(&tusUpload)
if ret.Error != nil && ret.Error.Error() != "record not found" { if ret.Error != nil && ret.Error.Error() != "record not found" {
shared.GetLogger().Error("failed fetching tus entry", zap.Error(err)) logger.Get().Error("failed fetching tus entry", zap.Error(err))
err = ret.Error err = ret.Error
} }