package v1 import ( "quyun/v2/app/errorx" "quyun/v2/app/http/v1/dto" auth_dto "quyun/v2/app/http/v1/dto" "quyun/v2/app/requests" "quyun/v2/app/services" "quyun/v2/database/models" "github.com/gofiber/fiber/v3" ) // @provider type User struct{} // Get current user profile // // @Router /v1/t/:tenantCode/me [get] // @Summary Get user profile // @Description Get current user profile // @Tags UserCenter // @Accept json // @Produce json // @Success 200 {object} auth_dto.User // @Bind user local key(__ctx_user) func (u *User) Me(_ fiber.Ctx, user *models.User) (*auth_dto.User, error) { return services.User.ToAuthUserDTO(user), nil } // Update user profile // // @Router /v1/t/:tenantCode/me [put] // @Summary Update user profile // @Description Update user profile // @Tags UserCenter // @Accept json // @Produce json // @Param form body dto.UserUpdate true "Update form" // @Success 200 {string} string "Updated" // @Bind user local key(__ctx_user) // @Bind form body func (u *User) Update(ctx fiber.Ctx, user *models.User, form *dto.UserUpdate) error { if err := services.User.Update(ctx, user.ID, form); err != nil { return errorx.ErrOperationFailed.WithCause(err) } return nil } // Submit real-name authentication // // @Router /v1/t/:tenantCode/me/realname [post] // @Summary Realname auth // @Description Submit real-name authentication // @Tags UserCenter // @Accept json // @Produce json // @Param form body dto.RealNameForm true "Realname form" // @Success 200 {string} string "Submitted" // @Bind user local key(__ctx_user) // @Bind form body func (u *User) RealName(ctx fiber.Ctx, user *models.User, form *dto.RealNameForm) error { if err := services.User.RealName(ctx, user.ID, form); err != nil { return errorx.ErrOperationFailed.WithCause(err) } return nil } // Get wallet balance and transactions // // @Router /v1/t/:tenantCode/me/wallet [get] // @Summary Get wallet // @Description Get wallet balance and transactions // @Tags UserCenter // @Accept json // @Produce json // @Success 200 {object} dto.WalletResponse // @Bind user local key(__ctx_user) func (u *User) Wallet(ctx fiber.Ctx, user *models.User) (*dto.WalletResponse, error) { tenantID := getTenantID(ctx) return services.Wallet.GetWallet(ctx, tenantID, user.ID) } // Recharge wallet // // @Router /v1/t/:tenantCode/me/wallet/recharge [post] // @Summary Recharge wallet // @Description Recharge wallet // @Tags UserCenter // @Accept json // @Produce json // @Param form body dto.RechargeForm true "Recharge form" // @Success 200 {object} dto.RechargeResponse // @Bind user local key(__ctx_user) // @Bind form body func (u *User) Recharge(ctx fiber.Ctx, user *models.User, form *dto.RechargeForm) (*dto.RechargeResponse, error) { tenantID := getTenantID(ctx) return services.Wallet.Recharge(ctx, tenantID, user.ID, form) } // List user orders // // @Router /v1/t/:tenantCode/me/orders [get] // @Summary List orders // @Description List user orders // @Tags UserCenter // @Accept json // @Produce json // @Param status query string false "Status enum(all, unpaid, completed, refund)" // @Success 200 {array} dto.Order // @Bind user local key(__ctx_user) // @Bind status query func (u *User) ListOrders(ctx fiber.Ctx, user *models.User, status string) ([]dto.Order, error) { tenantID := getTenantID(ctx) return services.Order.ListUserOrders(ctx, tenantID, user.ID, status) } // Get user order detail // // @Router /v1/t/:tenantCode/me/orders/:id [get] // @Summary Get order detail // @Description Get user order detail // @Tags UserCenter // @Accept json // @Produce json // @Param id path int64 true "Order ID" // @Success 200 {object} dto.Order // @Bind user local key(__ctx_user) // @Bind id path func (u *User) GetOrder(ctx fiber.Ctx, user *models.User, id int64) (*dto.Order, error) { tenantID := getTenantID(ctx) return services.Order.GetUserOrder(ctx, tenantID, user.ID, id) } // Get purchased content // // @Router /v1/t/:tenantCode/me/library [get] // @Summary Get library // @Description Get purchased content // @Tags UserCenter // @Accept json // @Produce json // @Success 200 {array} dto.ContentItem // @Bind user local key(__ctx_user) func (u *User) Library(ctx fiber.Ctx, user *models.User) ([]dto.ContentItem, error) { tenantID := getTenantID(ctx) return services.Content.GetLibrary(ctx, tenantID, user.ID) } // Get favorites // // @Router /v1/t/:tenantCode/me/favorites [get] // @Summary Get favorites // @Description Get favorites // @Tags UserCenter // @Accept json // @Produce json // @Success 200 {array} dto.ContentItem // @Bind user local key(__ctx_user) func (u *User) Favorites(ctx fiber.Ctx, user *models.User) ([]dto.ContentItem, error) { tenantID := getTenantID(ctx) return services.Content.GetFavorites(ctx, tenantID, user.ID) } // Add to favorites // // @Router /v1/t/:tenantCode/me/favorites [post] // @Summary Add favorite // @Description Add to favorites // @Tags UserCenter // @Accept json // @Produce json // @Param content_id query int64 true "Content ID" // @Success 200 {string} string "Added" // @Bind user local key(__ctx_user) // @Bind contentID query key(content_id) func (u *User) AddFavorite(ctx fiber.Ctx, user *models.User, contentID int64) error { tenantID := getTenantID(ctx) return services.Content.AddFavorite(ctx, tenantID, user.ID, contentID) } // Remove from favorites // // @Router /v1/t/:tenantCode/me/favorites/:contentId [delete] // @Summary Remove favorite // @Description Remove from favorites // @Tags UserCenter // @Accept json // @Produce json // @Param contentId path int64 true "Content ID" // @Success 200 {string} string "Removed" // @Bind user local key(__ctx_user) // @Bind contentID path key(contentId) func (u *User) RemoveFavorite(ctx fiber.Ctx, user *models.User, contentID int64) error { tenantID := getTenantID(ctx) return services.Content.RemoveFavorite(ctx, tenantID, user.ID, contentID) } // Get liked contents // // @Router /v1/t/:tenantCode/me/likes [get] // @Summary Get likes // @Description Get liked contents // @Tags UserCenter // @Accept json // @Produce json // @Success 200 {array} dto.ContentItem // @Bind user local key(__ctx_user) func (u *User) Likes(ctx fiber.Ctx, user *models.User) ([]dto.ContentItem, error) { tenantID := getTenantID(ctx) return services.Content.GetLikes(ctx, tenantID, user.ID) } // Like content // // @Router /v1/t/:tenantCode/me/likes [post] // @Summary Like content // @Description Like content // @Tags UserCenter // @Accept json // @Produce json // @Param content_id query int64 true "Content ID" // @Success 200 {string} string "Liked" // @Bind user local key(__ctx_user) // @Bind contentID query key(content_id) func (u *User) AddLike(ctx fiber.Ctx, user *models.User, contentID int64) error { tenantID := getTenantID(ctx) return services.Content.AddLike(ctx, tenantID, user.ID, contentID) } // Unlike content // // @Router /v1/t/:tenantCode/me/likes/:contentId [delete] // @Summary Unlike content // @Description Unlike content // @Tags UserCenter // @Accept json // @Produce json // @Param contentId path int64 true "Content ID" // @Success 200 {string} string "Unliked" // @Bind user local key(__ctx_user) // @Bind contentID path key(contentId) func (u *User) RemoveLike(ctx fiber.Ctx, user *models.User, contentID int64) error { tenantID := getTenantID(ctx) return services.Content.RemoveLike(ctx, tenantID, user.ID, contentID) } // Get following tenants // // @Router /v1/t/:tenantCode/me/following [get] // @Summary Get following // @Description Get following tenants // @Tags UserCenter // @Accept json // @Produce json // @Success 200 {array} dto.TenantProfile // @Bind user local key(__ctx_user) func (u *User) Following(ctx fiber.Ctx, user *models.User) ([]dto.TenantProfile, error) { tenantID := getTenantID(ctx) return services.Tenant.ListFollowed(ctx, tenantID, user.ID) } // Get notifications // // @Router /v1/t/:tenantCode/me/notifications [get] // @Summary Get notifications // @Description Get notifications // @Tags UserCenter // @Accept json // @Produce json // @Param type query string false "Type enum(all, system, order, audit, interaction)" // @Param page query int false "Page number" // @Success 200 {object} requests.Pager{items=[]dto.Notification} // @Bind user local key(__ctx_user) // @Bind typeArg query key(type) // @Bind page query func (u *User) Notifications(ctx fiber.Ctx, user *models.User, typeArg string, page int) (*requests.Pager, error) { tenantID := getTenantID(ctx) return services.Notification.List(ctx, tenantID, user.ID, page, typeArg) } // Mark notification as read // // @Router /v1/t/:tenantCode/me/notifications/:id/read [post] // @Summary Mark as read // @Tags UserCenter // @Accept json // @Produce json // @Param id path int64 true "Notification ID" // @Success 200 {string} string "OK" // @Bind user local key(__ctx_user) // @Bind id path func (u *User) MarkNotificationRead(ctx fiber.Ctx, user *models.User, id int64) error { tenantID := getTenantID(ctx) return services.Notification.MarkRead(ctx, tenantID, user.ID, id) } // Mark all notifications as read // // @Router /v1/t/:tenantCode/me/notifications/read-all [post] // @Summary Mark all as read // @Tags UserCenter // @Accept json // @Produce json // @Success 200 {string} string "OK" // @Bind user local key(__ctx_user) func (u *User) MarkAllNotificationsRead(ctx fiber.Ctx, user *models.User) error { tenantID := getTenantID(ctx) return services.Notification.MarkAllRead(ctx, tenantID, user.ID) } // List my coupons // // @Router /v1/t/:tenantCode/me/coupons [get] // @Summary List coupons // @Description List my coupons // @Tags UserCenter // @Accept json // @Produce json // @Param status query string false "Status (unused, used, expired)" // @Success 200 {array} dto.UserCouponItem // @Bind user local key(__ctx_user) // @Bind status query func (u *User) MyCoupons(ctx fiber.Ctx, user *models.User, status string) ([]dto.UserCouponItem, error) { tenantID := getTenantID(ctx) return services.Coupon.ListUserCoupons(ctx, tenantID, user.ID, status) } // List available coupons for order amount // // @Router /v1/t/:tenantCode/me/coupons/available [get] // @Summary List available coupons // @Description List coupons available for the given order amount // @Tags UserCenter // @Accept json // @Produce json // @Param amount query int64 true "Order amount (cents)" // @Success 200 {array} dto.UserCouponItem // @Bind user local key(__ctx_user) // @Bind amount query func (u *User) AvailableCoupons(ctx fiber.Ctx, user *models.User, amount int64) ([]dto.UserCouponItem, error) { tenantID := getTenantID(ctx) return services.Coupon.ListAvailable(ctx, tenantID, user.ID, amount) } // Receive coupon // // @Router /v1/t/:tenantCode/me/coupons/receive [post] // @Summary Receive coupon // @Description Receive a coupon by coupon_id // @Tags UserCenter // @Accept json // @Produce json // @Param form body dto.CouponReceiveForm true "Receive form" // @Success 200 {object} dto.UserCouponItem // @Bind user local key(__ctx_user) // @Bind form body func (u *User) ReceiveCoupon(ctx fiber.Ctx, user *models.User, form *dto.CouponReceiveForm) (*dto.UserCouponItem, error) { tenantID := getTenantID(ctx) if form == nil { return nil, errorx.ErrInvalidParameter.WithMsg("参数无效") } return services.Coupon.Receive(ctx, tenantID, user.ID, form.CouponID) }