This commit is contained in:
2025-07-28 23:28:24 +08:00
parent 32000a417d
commit f8ac02e7c9
4 changed files with 66 additions and 10 deletions

View File

@@ -59,6 +59,10 @@ type SubscriptionApplicationService interface {
GetSubscriptionByID(ctx context.Context, query *queries.GetSubscriptionQuery) (*responses.SubscriptionInfoResponse, error)
ListSubscriptions(ctx context.Context, query *queries.ListSubscriptionsQuery) (*responses.SubscriptionListResponse, error)
// 我的订阅(用户专用)
ListMySubscriptions(ctx context.Context, userID string, query *queries.ListSubscriptionsQuery) (*responses.SubscriptionListResponse, error)
GetMySubscriptionStats(ctx context.Context, userID string) (*responses.SubscriptionStatsResponse, error)
// 业务查询
GetUserSubscriptions(ctx context.Context, query *queries.GetUserSubscriptionsQuery) ([]*responses.SubscriptionInfoResponse, error)
GetProductSubscriptions(ctx context.Context, query *queries.GetProductSubscriptionsQuery) ([]*responses.SubscriptionInfoResponse, error)

View File

@@ -70,12 +70,46 @@ func (s *SubscriptionApplicationServiceImpl) GetSubscriptionByID(ctx context.Con
return s.convertToSubscriptionInfoResponse(subscription), nil
}
// ListSubscriptions 获取订阅列表
// ListSubscriptions 获取订阅列表(管理员用)
// 业务流程1. 获取订阅列表 2. 构建响应数据
func (s *SubscriptionApplicationServiceImpl) ListSubscriptions(ctx context.Context, query *appQueries.ListSubscriptionsQuery) (*responses.SubscriptionListResponse, error) {
repoQuery := &repoQueries.ListSubscriptionsQuery{
Page: query.Page,
PageSize: query.PageSize,
Page: query.Page,
PageSize: query.PageSize,
UserID: query.UserID, // 管理员可以按用户筛选
Keyword: query.Keyword,
SortBy: query.SortBy,
SortOrder: query.SortOrder,
}
subscriptions, total, err := s.productSubscriptionService.ListSubscriptions(ctx, repoQuery)
if err != nil {
return nil, err
}
items := make([]responses.SubscriptionInfoResponse, len(subscriptions))
for i := range subscriptions {
resp := s.convertToSubscriptionInfoResponse(subscriptions[i])
if resp != nil {
items[i] = *resp // 解引用指针
}
}
return &responses.SubscriptionListResponse{
Total: total,
Page: query.Page,
Size: query.PageSize,
Items: items,
}, nil
}
// ListMySubscriptions 获取我的订阅列表(用户用)
// 业务流程1. 获取用户订阅列表 2. 构建响应数据
func (s *SubscriptionApplicationServiceImpl) ListMySubscriptions(ctx context.Context, userID string, query *appQueries.ListSubscriptionsQuery) (*responses.SubscriptionListResponse, error) {
repoQuery := &repoQueries.ListSubscriptionsQuery{
Page: query.Page,
PageSize: query.PageSize,
UserID: userID, // 强制设置为当前用户ID
Keyword: query.Keyword,
SortBy: query.SortBy,
SortOrder: query.SortOrder,
}
subscriptions, total, err := s.productSubscriptionService.ListSubscriptions(ctx, repoQuery)
if err != nil {
@@ -147,6 +181,27 @@ func (s *SubscriptionApplicationServiceImpl) GetSubscriptionStats(ctx context.Co
}, nil
}
// GetMySubscriptionStats 获取我的订阅统计信息
// 业务流程1. 获取用户订阅统计 2. 构建响应数据
func (s *SubscriptionApplicationServiceImpl) GetMySubscriptionStats(ctx context.Context, userID string) (*responses.SubscriptionStatsResponse, error) {
// 获取用户订阅数量
subscriptions, err := s.productSubscriptionService.GetUserSubscriptions(ctx, userID)
if err != nil {
return nil, err
}
// 计算总收益
var totalRevenue float64
for _, subscription := range subscriptions {
totalRevenue += subscription.Price.InexactFloat64()
}
return &responses.SubscriptionStatsResponse{
TotalSubscriptions: int64(len(subscriptions)),
TotalRevenue: totalRevenue,
}, nil
}
// convertToSubscriptionInfoResponse 转换为订阅信息响应
func (s *SubscriptionApplicationServiceImpl) convertToSubscriptionInfoResponse(subscription *entities.Subscription) *responses.SubscriptionInfoResponse {
return &responses.SubscriptionInfoResponse{

View File

@@ -55,7 +55,7 @@ func (p *Product) IsVisibleToUser() bool {
// CanBeSubscribed 检查产品是否可以订阅
func (p *Product) CanBeSubscribed() bool {
return p.IsValid() && p.IsVisible
return p.IsValid()
}

View File

@@ -394,7 +394,7 @@ func (h *ProductHandler) ListMySubscriptions(c *gin.Context) {
var query queries.ListSubscriptionsQuery
if err := h.validator.ValidateQuery(c, &query); err != nil {
return
return
}
// 设置默认值
@@ -408,10 +408,7 @@ func (h *ProductHandler) ListMySubscriptions(c *gin.Context) {
query.PageSize = 100
}
// 设置用户ID
query.UserID = userID
result, err := h.subAppService.ListSubscriptions(c.Request.Context(), &query)
result, err := h.subAppService.ListMySubscriptions(c.Request.Context(), userID, &query)
if err != nil {
h.logger.Error("获取我的订阅列表失败", zap.Error(err), zap.String("user_id", userID))
h.responseBuilder.InternalError(c, "获取我的订阅列表失败")
@@ -439,7 +436,7 @@ func (h *ProductHandler) GetMySubscriptionStats(c *gin.Context) {
return
}
result, err := h.subAppService.GetSubscriptionStats(c.Request.Context())
result, err := h.subAppService.GetMySubscriptionStats(c.Request.Context(), userID)
if err != nil {
h.logger.Error("获取我的订阅统计失败", zap.Error(err), zap.String("user_id", userID))
h.responseBuilder.InternalError(c, "获取我的订阅统计失败")