Skip to content

Commit 6c02076

Browse files
authored
Merge pull request Wei-Shaw#1106 from geminiwen/feat/subscription-platform-filter
feat: add platform type filter to subscription management
2 parents 7414bdf + 1ac7219 commit 6c02076

13 files changed

Lines changed: 40 additions & 13 deletions

backend/internal/handler/admin/subscription_handler.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,13 @@ func (h *SubscriptionHandler) List(c *gin.Context) {
7777
}
7878
}
7979
status := c.Query("status")
80+
platform := c.Query("platform")
8081

8182
// Parse sorting parameters
8283
sortBy := c.DefaultQuery("sort_by", "created_at")
8384
sortOrder := c.DefaultQuery("sort_order", "desc")
8485

85-
subscriptions, pagination, err := h.subscriptionService.List(c.Request.Context(), page, pageSize, userID, groupID, status, sortBy, sortOrder)
86+
subscriptions, pagination, err := h.subscriptionService.List(c.Request.Context(), page, pageSize, userID, groupID, status, platform, sortBy, sortOrder)
8687
if err != nil {
8788
response.ErrorFrom(c, err)
8889
return

backend/internal/repository/user_subscription_repo.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"time"
66

77
dbent "github.com/Wei-Shaw/sub2api/ent"
8+
"github.com/Wei-Shaw/sub2api/ent/group"
89
"github.com/Wei-Shaw/sub2api/ent/usersubscription"
910
"github.com/Wei-Shaw/sub2api/internal/pkg/pagination"
1011
"github.com/Wei-Shaw/sub2api/internal/service"
@@ -190,7 +191,7 @@ func (r *userSubscriptionRepository) ListByGroupID(ctx context.Context, groupID
190191
return userSubscriptionEntitiesToService(subs), paginationResultFromTotal(int64(total), params), nil
191192
}
192193

193-
func (r *userSubscriptionRepository) List(ctx context.Context, params pagination.PaginationParams, userID, groupID *int64, status, sortBy, sortOrder string) ([]service.UserSubscription, *pagination.PaginationResult, error) {
194+
func (r *userSubscriptionRepository) List(ctx context.Context, params pagination.PaginationParams, userID, groupID *int64, status, platform, sortBy, sortOrder string) ([]service.UserSubscription, *pagination.PaginationResult, error) {
194195
client := clientFromContext(ctx, r.client)
195196
q := client.UserSubscription.Query()
196197
if userID != nil {
@@ -199,6 +200,9 @@ func (r *userSubscriptionRepository) List(ctx context.Context, params pagination
199200
if groupID != nil {
200201
q = q.Where(usersubscription.GroupIDEQ(*groupID))
201202
}
203+
if platform != "" {
204+
q = q.Where(usersubscription.HasGroupWith(group.PlatformEQ(platform)))
205+
}
202206

203207
// Status filtering with real-time expiration check
204208
now := time.Now()

backend/internal/repository/user_subscription_repo_integration_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ func (s *UserSubscriptionRepoSuite) TestList_NoFilters() {
271271
group := s.mustCreateGroup("g-list")
272272
s.mustCreateSubscription(user.ID, group.ID, nil)
273273

274-
subs, page, err := s.repo.List(s.ctx, pagination.PaginationParams{Page: 1, PageSize: 10}, nil, nil, "", "", "")
274+
subs, page, err := s.repo.List(s.ctx, pagination.PaginationParams{Page: 1, PageSize: 10}, nil, nil, "", "", "", "")
275275
s.Require().NoError(err, "List")
276276
s.Require().Len(subs, 1)
277277
s.Require().Equal(int64(1), page.Total)
@@ -285,7 +285,7 @@ func (s *UserSubscriptionRepoSuite) TestList_FilterByUserID() {
285285
s.mustCreateSubscription(user1.ID, group.ID, nil)
286286
s.mustCreateSubscription(user2.ID, group.ID, nil)
287287

288-
subs, _, err := s.repo.List(s.ctx, pagination.PaginationParams{Page: 1, PageSize: 10}, &user1.ID, nil, "", "", "")
288+
subs, _, err := s.repo.List(s.ctx, pagination.PaginationParams{Page: 1, PageSize: 10}, &user1.ID, nil, "", "", "", "")
289289
s.Require().NoError(err)
290290
s.Require().Len(subs, 1)
291291
s.Require().Equal(user1.ID, subs[0].UserID)
@@ -299,7 +299,7 @@ func (s *UserSubscriptionRepoSuite) TestList_FilterByGroupID() {
299299
s.mustCreateSubscription(user.ID, g1.ID, nil)
300300
s.mustCreateSubscription(user.ID, g2.ID, nil)
301301

302-
subs, _, err := s.repo.List(s.ctx, pagination.PaginationParams{Page: 1, PageSize: 10}, nil, &g1.ID, "", "", "")
302+
subs, _, err := s.repo.List(s.ctx, pagination.PaginationParams{Page: 1, PageSize: 10}, nil, &g1.ID, "", "", "", "")
303303
s.Require().NoError(err)
304304
s.Require().Len(subs, 1)
305305
s.Require().Equal(g1.ID, subs[0].GroupID)
@@ -320,7 +320,7 @@ func (s *UserSubscriptionRepoSuite) TestList_FilterByStatus() {
320320
c.SetExpiresAt(time.Now().Add(-24 * time.Hour))
321321
})
322322

323-
subs, _, err := s.repo.List(s.ctx, pagination.PaginationParams{Page: 1, PageSize: 10}, nil, nil, service.SubscriptionStatusExpired, "", "")
323+
subs, _, err := s.repo.List(s.ctx, pagination.PaginationParams{Page: 1, PageSize: 10}, nil, nil, service.SubscriptionStatusExpired, "", "", "")
324324
s.Require().NoError(err)
325325
s.Require().Len(subs, 1)
326326
s.Require().Equal(service.SubscriptionStatusExpired, subs[0].Status)

backend/internal/server/api_contract_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1289,7 +1289,7 @@ func (r *stubUserSubscriptionRepo) ListActiveByUserID(ctx context.Context, userI
12891289
func (stubUserSubscriptionRepo) ListByGroupID(ctx context.Context, groupID int64, params pagination.PaginationParams) ([]service.UserSubscription, *pagination.PaginationResult, error) {
12901290
return nil, nil, errors.New("not implemented")
12911291
}
1292-
func (stubUserSubscriptionRepo) List(ctx context.Context, params pagination.PaginationParams, userID, groupID *int64, status, sortBy, sortOrder string) ([]service.UserSubscription, *pagination.PaginationResult, error) {
1292+
func (stubUserSubscriptionRepo) List(ctx context.Context, params pagination.PaginationParams, userID, groupID *int64, status, platform, sortBy, sortOrder string) ([]service.UserSubscription, *pagination.PaginationResult, error) {
12931293
return nil, nil, errors.New("not implemented")
12941294
}
12951295
func (stubUserSubscriptionRepo) ExistsByUserIDAndGroupID(ctx context.Context, userID, groupID int64) (bool, error) {

backend/internal/server/middleware/api_key_auth_google_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ func (f fakeGoogleSubscriptionRepo) ListActiveByUserID(ctx context.Context, user
135135
func (f fakeGoogleSubscriptionRepo) ListByGroupID(ctx context.Context, groupID int64, params pagination.PaginationParams) ([]service.UserSubscription, *pagination.PaginationResult, error) {
136136
return nil, nil, errors.New("not implemented")
137137
}
138-
func (f fakeGoogleSubscriptionRepo) List(ctx context.Context, params pagination.PaginationParams, userID, groupID *int64, status, sortBy, sortOrder string) ([]service.UserSubscription, *pagination.PaginationResult, error) {
138+
func (f fakeGoogleSubscriptionRepo) List(ctx context.Context, params pagination.PaginationParams, userID, groupID *int64, status, platform, sortBy, sortOrder string) ([]service.UserSubscription, *pagination.PaginationResult, error) {
139139
return nil, nil, errors.New("not implemented")
140140
}
141141
func (f fakeGoogleSubscriptionRepo) ExistsByUserIDAndGroupID(ctx context.Context, userID, groupID int64) (bool, error) {

backend/internal/server/middleware/api_key_auth_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -646,7 +646,7 @@ func (r *stubUserSubscriptionRepo) ListByGroupID(ctx context.Context, groupID in
646646
return nil, nil, errors.New("not implemented")
647647
}
648648

649-
func (r *stubUserSubscriptionRepo) List(ctx context.Context, params pagination.PaginationParams, userID, groupID *int64, status, sortBy, sortOrder string) ([]service.UserSubscription, *pagination.PaginationResult, error) {
649+
func (r *stubUserSubscriptionRepo) List(ctx context.Context, params pagination.PaginationParams, userID, groupID *int64, status, platform, sortBy, sortOrder string) ([]service.UserSubscription, *pagination.PaginationResult, error) {
650650
return nil, nil, errors.New("not implemented")
651651
}
652652

backend/internal/service/subscription_assign_idempotency_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ func (userSubRepoNoop) ListActiveByUserID(context.Context, int64) ([]UserSubscri
9292
func (userSubRepoNoop) ListByGroupID(context.Context, int64, pagination.PaginationParams) ([]UserSubscription, *pagination.PaginationResult, error) {
9393
panic("unexpected ListByGroupID call")
9494
}
95-
func (userSubRepoNoop) List(context.Context, pagination.PaginationParams, *int64, *int64, string, string, string) ([]UserSubscription, *pagination.PaginationResult, error) {
95+
func (userSubRepoNoop) List(context.Context, pagination.PaginationParams, *int64, *int64, string, string, string, string) ([]UserSubscription, *pagination.PaginationResult, error) {
9696
panic("unexpected List call")
9797
}
9898
func (userSubRepoNoop) ExistsByUserIDAndGroupID(context.Context, int64, int64) (bool, error) {

backend/internal/service/subscription_service.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -634,9 +634,9 @@ func (s *SubscriptionService) ListGroupSubscriptions(ctx context.Context, groupI
634634
}
635635

636636
// List 获取所有订阅(分页,支持筛选和排序)
637-
func (s *SubscriptionService) List(ctx context.Context, page, pageSize int, userID, groupID *int64, status, sortBy, sortOrder string) ([]UserSubscription, *pagination.PaginationResult, error) {
637+
func (s *SubscriptionService) List(ctx context.Context, page, pageSize int, userID, groupID *int64, status, platform, sortBy, sortOrder string) ([]UserSubscription, *pagination.PaginationResult, error) {
638638
params := pagination.PaginationParams{Page: page, PageSize: pageSize}
639-
subs, pag, err := s.userSubRepo.List(ctx, params, userID, groupID, status, sortBy, sortOrder)
639+
subs, pag, err := s.userSubRepo.List(ctx, params, userID, groupID, status, platform, sortBy, sortOrder)
640640
if err != nil {
641641
return nil, nil, err
642642
}

backend/internal/service/user_subscription_port.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ type UserSubscriptionRepository interface {
1818
ListByUserID(ctx context.Context, userID int64) ([]UserSubscription, error)
1919
ListActiveByUserID(ctx context.Context, userID int64) ([]UserSubscription, error)
2020
ListByGroupID(ctx context.Context, groupID int64, params pagination.PaginationParams) ([]UserSubscription, *pagination.PaginationResult, error)
21-
List(ctx context.Context, params pagination.PaginationParams, userID, groupID *int64, status, sortBy, sortOrder string) ([]UserSubscription, *pagination.PaginationResult, error)
21+
List(ctx context.Context, params pagination.PaginationParams, userID, groupID *int64, status, platform, sortBy, sortOrder string) ([]UserSubscription, *pagination.PaginationResult, error)
2222

2323
ExistsByUserIDAndGroupID(ctx context.Context, userID, groupID int64) (bool, error)
2424
ExtendExpiry(ctx context.Context, subscriptionID int64, newExpiresAt time.Time) error

frontend/src/api/admin/subscriptions.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export async function list(
2727
status?: 'active' | 'expired' | 'revoked'
2828
user_id?: number
2929
group_id?: number
30+
platform?: string
3031
sort_by?: string
3132
sort_order?: 'asc' | 'desc'
3233
},

0 commit comments

Comments
 (0)