@@ -22,12 +22,13 @@ type ClassroomCourseworkCmd struct {
2222}
2323
2424type ClassroomCourseworkListCmd struct {
25- CourseID string `arg:"" name:"courseId" help:"Course ID or alias"`
26- States string `name:"state" help:"Coursework states filter (comma-separated: DRAFT,PUBLISHED,DELETED)"`
27- Topic string `name:"topic" help:"Filter by topic ID"`
28- OrderBy string `name:"order-by" help:"Order by (e.g., updateTime desc, dueDate desc)"`
29- Max int64 `name:"max" aliases:"limit" help:"Max results" default:"100"`
30- Page string `name:"page" help:"Page token"`
25+ CourseID string `arg:"" name:"courseId" help:"Course ID or alias"`
26+ States string `name:"state" help:"Coursework states filter (comma-separated: DRAFT,PUBLISHED,DELETED)"`
27+ Topic string `name:"topic" help:"Filter by topic ID"`
28+ OrderBy string `name:"order-by" help:"Order by (e.g., updateTime desc, dueDate desc)"`
29+ Max int64 `name:"max" aliases:"limit" help:"Max results" default:"100"`
30+ Page string `name:"page" help:"Page token"`
31+ ScanPages int `name:"scan-pages" help:"Pages to scan when filtering by topic" default:"3"`
3132}
3233
3334func (c * ClassroomCourseworkListCmd ) Run (ctx context.Context , flags * RootFlags ) error {
@@ -46,45 +47,71 @@ func (c *ClassroomCourseworkListCmd) Run(ctx context.Context, flags *RootFlags)
4647 return wrapClassroomError (err )
4748 }
4849
49- call := svc .Courses .CourseWork .List (courseID ).PageSize (c .Max ).PageToken (c .Page ).Context (ctx )
50- if states := splitCSV (c .States ); len (states ) > 0 {
51- upper := make ([]string , 0 , len (states ))
52- for _ , state := range states {
53- upper = append (upper , strings .ToUpper (state ))
50+ makeCall := func (page string ) * classroom.CoursesCourseWorkListCall {
51+ call := svc .Courses .CourseWork .List (courseID ).PageSize (c .Max ).PageToken (page ).Context (ctx )
52+ if states := splitCSV (c .States ); len (states ) > 0 {
53+ upper := make ([]string , 0 , len (states ))
54+ for _ , state := range states {
55+ upper = append (upper , strings .ToUpper (state ))
56+ }
57+ call .CourseWorkStates (upper ... )
5458 }
55- call .CourseWorkStates (upper ... )
56- }
57- if v := strings .TrimSpace (c .OrderBy ); v != "" {
58- call .OrderBy (v )
59- }
60-
61- resp , err := call .Do ()
62- if err != nil {
63- return wrapClassroomError (err )
59+ if v := strings .TrimSpace (c .OrderBy ); v != "" {
60+ call .OrderBy (v )
61+ }
62+ return call
6463 }
6564
66- // Client-side filter by topic (API doesn't support server-side topic filter)
6765 topicFilter := strings .TrimSpace (c .Topic )
68- coursework := resp .CourseWork
69- if topicFilter != "" {
70- filtered := make ([]* classroom.CourseWork , 0 , len (coursework ))
71- for _ , work := range coursework {
66+ pageToken := c .Page
67+ scanPages := c .ScanPages
68+ if scanPages <= 0 {
69+ scanPages = 1
70+ }
71+
72+ var (
73+ coursework []* classroom.CourseWork
74+ nextPageToken string
75+ )
76+ for page := 0 ; ; page ++ {
77+ resp , err := makeCall (pageToken ).Do ()
78+ if err != nil {
79+ return wrapClassroomError (err )
80+ }
81+ nextPageToken = resp .NextPageToken
82+
83+ if topicFilter == "" {
84+ coursework = resp .CourseWork
85+ break
86+ }
87+
88+ filtered := make ([]* classroom.CourseWork , 0 , len (resp .CourseWork ))
89+ for _ , work := range resp .CourseWork {
7290 if work != nil && work .TopicId == topicFilter {
7391 filtered = append (filtered , work )
7492 }
7593 }
76- coursework = filtered
94+ if len (filtered ) > 0 {
95+ coursework = filtered
96+ break
97+ }
98+ if nextPageToken == "" || page + 1 >= scanPages {
99+ coursework = filtered
100+ break
101+ }
102+ pageToken = nextPageToken
77103 }
78104
79105 if outfmt .IsJSON (ctx ) {
80106 return outfmt .WriteJSON (os .Stdout , map [string ]any {
81107 "coursework" : coursework ,
82- "nextPageToken" : resp . NextPageToken ,
108+ "nextPageToken" : nextPageToken ,
83109 })
84110 }
85111
86112 if len (coursework ) == 0 {
87113 u .Err ().Println ("No coursework" )
114+ printNextPageHint (u , nextPageToken )
88115 return nil
89116 }
90117
@@ -104,7 +131,7 @@ func (c *ClassroomCourseworkListCmd) Run(ctx context.Context, flags *RootFlags)
104131 formatFloatValue (work .MaxPoints ),
105132 )
106133 }
107- printNextPageHint (u , resp . NextPageToken )
134+ printNextPageHint (u , nextPageToken )
108135 return nil
109136}
110137
0 commit comments