Go workspace (go.work) with 5 microservices + shared library: - gateway (8080), auth-service (8081), purchaser-service (8082) - textile-service (8083), washing-service (8084) - shared: proto definitions, common packages Infrastructure: docker-compose for local dev, K8s manifests for K3s cluster deployment (mysql/redis/etcd + traefik ingress). Frontend (iloom-flatten) added as git submodule. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
135 lines
3.2 KiB
Go
135 lines
3.2 KiB
Go
package handler
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/muyuqingfeng/iloom/auth-service/internal/repository"
|
|
"github.com/muyuqingfeng/iloom/shared/pkg/response"
|
|
)
|
|
|
|
type CommonHandler struct {
|
|
shareLinkRepo *repository.ShareLinkRepo
|
|
auditLogRepo *repository.AuditLogRepo
|
|
}
|
|
|
|
func NewCommonHandler(slRepo *repository.ShareLinkRepo, alRepo *repository.AuditLogRepo) *CommonHandler {
|
|
return &CommonHandler{shareLinkRepo: slRepo, auditLogRepo: alRepo}
|
|
}
|
|
|
|
type createShareLinkReq struct {
|
|
ResourceType string `json:"resource_type" binding:"required"`
|
|
ResourceID string `json:"resource_id" binding:"required"`
|
|
ExpiresIn int `json:"expires_in"` // seconds, 0 = no expiry
|
|
}
|
|
|
|
func (h *CommonHandler) CreateShareLink(c *gin.Context) {
|
|
var req createShareLinkReq
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
response.BadRequest(c, "invalid request: "+err.Error())
|
|
return
|
|
}
|
|
|
|
userID := c.GetHeader("X-User-ID")
|
|
companyID := c.GetHeader("X-Company-ID")
|
|
|
|
var expiresAt *time.Time
|
|
if req.ExpiresIn > 0 {
|
|
t := time.Now().Add(time.Duration(req.ExpiresIn) * time.Second)
|
|
expiresAt = &t
|
|
}
|
|
|
|
link, err := h.shareLinkRepo.Create(c.Request.Context(), companyID, userID, req.ResourceType, req.ResourceID, expiresAt)
|
|
if err != nil {
|
|
response.InternalError(c, err.Error())
|
|
return
|
|
}
|
|
|
|
response.OK(c, link)
|
|
}
|
|
|
|
func (h *CommonHandler) GetShareLink(c *gin.Context) {
|
|
code := c.Param("code")
|
|
|
|
link, err := h.shareLinkRepo.GetByCode(c.Request.Context(), code)
|
|
if err != nil {
|
|
response.InternalError(c, err.Error())
|
|
return
|
|
}
|
|
if link == nil {
|
|
response.NotFound(c, "share link not found")
|
|
return
|
|
}
|
|
|
|
// check expiry
|
|
if link.ExpiresAt != nil && link.ExpiresAt.Before(time.Now()) {
|
|
response.BadRequest(c, "share link expired")
|
|
return
|
|
}
|
|
|
|
response.OK(c, link)
|
|
}
|
|
|
|
type feedbackReq struct {
|
|
Content string `json:"content" binding:"required"`
|
|
Type string `json:"type"`
|
|
}
|
|
|
|
func (h *CommonHandler) Feedback(c *gin.Context) {
|
|
var req feedbackReq
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
response.BadRequest(c, "invalid request: "+err.Error())
|
|
return
|
|
}
|
|
|
|
userID := c.GetHeader("X-User-ID")
|
|
companyID := c.GetHeader("X-Company-ID")
|
|
|
|
feedbackType := req.Type
|
|
if feedbackType == "" {
|
|
feedbackType = "general"
|
|
}
|
|
|
|
err := h.auditLogRepo.Create(
|
|
c.Request.Context(), userID, companyID,
|
|
"feedback", feedbackType, "",
|
|
c.ClientIP(), map[string]string{"content": req.Content},
|
|
)
|
|
if err != nil {
|
|
response.InternalError(c, err.Error())
|
|
return
|
|
}
|
|
|
|
response.OK(c, gin.H{"message": "feedback received"})
|
|
}
|
|
|
|
type crashReportReq struct {
|
|
Error string `json:"error" binding:"required"`
|
|
StackTrace string `json:"stack_trace"`
|
|
UserAgent string `json:"user_agent"`
|
|
URL string `json:"url"`
|
|
}
|
|
|
|
func (h *CommonHandler) CrashReport(c *gin.Context) {
|
|
var req crashReportReq
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
response.BadRequest(c, "invalid request: "+err.Error())
|
|
return
|
|
}
|
|
|
|
userID := c.GetHeader("X-User-ID")
|
|
companyID := c.GetHeader("X-Company-ID")
|
|
|
|
err := h.auditLogRepo.Create(
|
|
c.Request.Context(), userID, companyID,
|
|
"crash_report", "frontend", "",
|
|
c.ClientIP(), req,
|
|
)
|
|
if err != nil {
|
|
response.InternalError(c, err.Error())
|
|
return
|
|
}
|
|
|
|
response.OK(c, gin.H{"message": "crash report received"})
|
|
}
|