draft grpc
This commit is contained in:
63
internal/api/usage/handler.go
Normal file
63
internal/api/usage/handler.go
Normal file
@@ -0,0 +1,63 @@
|
||||
//go:build ignore
|
||||
// +build ignore
|
||||
|
||||
package usage
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/gorm"
|
||||
"stream.api/internal/database/model"
|
||||
"stream.api/pkg/logger"
|
||||
"stream.api/pkg/response"
|
||||
)
|
||||
|
||||
type Handler struct {
|
||||
logger logger.Logger
|
||||
db *gorm.DB
|
||||
}
|
||||
|
||||
func NewHandler(l logger.Logger, db *gorm.DB) UsageHandler {
|
||||
return &Handler{
|
||||
logger: l,
|
||||
db: db,
|
||||
}
|
||||
}
|
||||
|
||||
// @Summary Get Usage
|
||||
// @Description Get the authenticated user's total video count and total storage usage
|
||||
// @Tags usage
|
||||
// @Produce json
|
||||
// @Success 200 {object} response.Response{data=UsagePayload}
|
||||
// @Failure 401 {object} response.Response
|
||||
// @Failure 500 {object} response.Response
|
||||
// @Router /usage [get]
|
||||
// @Security BearerAuth
|
||||
func (h *Handler) GetUsage(c *gin.Context) {
|
||||
userID := c.GetString("userID")
|
||||
if userID == "" {
|
||||
response.Error(c, http.StatusUnauthorized, "Unauthorized")
|
||||
return
|
||||
}
|
||||
|
||||
user, ok := c.Get("user")
|
||||
if !ok {
|
||||
response.Error(c, http.StatusUnauthorized, "Unauthorized")
|
||||
return
|
||||
}
|
||||
|
||||
currentUser, ok := user.(*model.User)
|
||||
if !ok || currentUser == nil || currentUser.ID != userID {
|
||||
response.Error(c, http.StatusUnauthorized, "Unauthorized")
|
||||
return
|
||||
}
|
||||
|
||||
payload, err := LoadUsage(c.Request.Context(), h.db, h.logger, currentUser)
|
||||
if err != nil {
|
||||
response.Error(c, http.StatusInternalServerError, "Failed to load usage")
|
||||
return
|
||||
}
|
||||
|
||||
response.Success(c, payload)
|
||||
}
|
||||
11
internal/api/usage/interface.go
Normal file
11
internal/api/usage/interface.go
Normal file
@@ -0,0 +1,11 @@
|
||||
//go:build ignore
|
||||
// +build ignore
|
||||
|
||||
package usage
|
||||
|
||||
import "github.com/gin-gonic/gin"
|
||||
|
||||
// UsageHandler defines the interface for usage operations
|
||||
type UsageHandler interface {
|
||||
GetUsage(c *gin.Context)
|
||||
}
|
||||
23
internal/api/usage/service.go
Normal file
23
internal/api/usage/service.go
Normal file
@@ -0,0 +1,23 @@
|
||||
package usage
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"gorm.io/gorm"
|
||||
"stream.api/internal/database/model"
|
||||
"stream.api/pkg/logger"
|
||||
)
|
||||
|
||||
func LoadUsage(ctx context.Context, db *gorm.DB, l logger.Logger, user *model.User) (*UsagePayload, error) {
|
||||
var totalVideos int64
|
||||
if err := db.WithContext(ctx).Model(&model.Video{}).Where("user_id = ?", user.ID).Count(&totalVideos).Error; err != nil {
|
||||
l.Error("Failed to count user videos", "error", err, "user_id", user.ID)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &UsagePayload{
|
||||
UserID: user.ID,
|
||||
TotalVideos: totalVideos,
|
||||
TotalStorage: user.StorageUsed,
|
||||
}, nil
|
||||
}
|
||||
7
internal/api/usage/types.go
Normal file
7
internal/api/usage/types.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package usage
|
||||
|
||||
type UsagePayload struct {
|
||||
UserID string `json:"user_id"`
|
||||
TotalVideos int64 `json:"total_videos"`
|
||||
TotalStorage int64 `json:"total_storage"`
|
||||
}
|
||||
Reference in New Issue
Block a user