gogcli 实战指南:用gog classroom guardian-invitations list管理 Google Classroom 监护人邀请
【免费下载链接】gogcliGoogle Workspace in your terminal.项目地址: https://gitcode.com/GitHub_Trending/gogcl/gogcli
导读
gog classroom guardian-invitations list是 gogcli(Google Workspace in your terminal)中用于列出指定学生监护人邀请记录的核心命令。本文围绕该命令,完整讲解其用法、参数语义、分页机制、过滤与状态筛选,并结合仓库源码(命令定义、分页助手、表格渲染与测试用例)剖析其底层实现,帮助你掌握在终端与脚本中批量查询监护人邀请、对接自动化运维场景的完整方法。
命令概览:一条命令,四种写法
该命令在 gogcli 的 Classroom 命令树中位于classroom → guardian-invitations之下,支持多级别名,官方文档给出的完整用法为:
gog classroom (class) guardian-invitations (guardian-invites) list (ls) <studentId> [flags]其中括号中的class、guardian-invites、ls均为别名,因此下面四种写法等价:
gog classroom guardian-invitations list <studentId> gog class guardian-invites ls <studentId> gog classroom guardian-invites list <studentId> gog class guardian-invitations ls <studentId>位置参数<studentId>是必填的 Google Classroom 学生 ID(userProfiles.guardianInvitations.listAPI 要求按学生维度查询)。从命令树定义看,guardian-invitations的别名为guardian-invites,list的别名为ls,且list是该子命令树的默认命令(cmd:"" default:"withargs"),见 internal/cmd/classroom.go 与 internal/cmd/classroom_guardians.go。与它并列的子命令还包括get(别名info,show)与create(别名add,new),三者共同构成监护人邀请的完整操作闭环。
命令特有参数:过滤、状态与分页
除全局通用 flag 外,list命令专属的参数定义在 internal/cmd/classroom_guardians.go 中:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
<studentId> | string | — | 必填。学生 ID,用于定位查询范围 |
--email | string | 空 | 按受邀监护人邮箱地址精确过滤 |
--state | string | 空 | 邀请状态过滤,逗号分隔,取值PENDING,COMPLETE |
--max/--limit | int64 | 100 | 单页最大结果数(即传给 API 的 pageSize) |
--page/--cursor | string | 空 | 分页游标(API 返回的 nextPageToken) |
--all/--all-pages/--allpages | bool | false | 自动翻页拉取全部结果 |
--fail-empty/--non-empty/--require-results | bool | false | 无结果时以退出码 3 结束(便于脚本判断) |
状态过滤的源码细节
--state参数在底层并不会被直接原样透传,而是先经过upperClassroomStates做大写归一化:该函数将逗号分隔的输入按 CSV 拆分后逐个strings.ToUpper(见 internal/cmd/classroom_list_helpers.go)。这意味着--state pending,complete、--state PENDING,COMPLETE均可被接受,最终调用call.States(states...)传给 Google Classroom API。同理,--email会先strings.TrimSpace去空白,非空时才调用call.InvitedEmailAddress(email)(见 internal/cmd/classroom_guardians.go)。
典型用法示例
1. 基础查询:列出某学生全部监护人邀请
gog classroom guardian-invitations list student-id-123默认返回前 100 条(--max默认值为 100),输出为表格形式,列头为INVITATION_ID、EMAIL、STATE、CREATED。这四列的定义见 internal/cmd/classroom_presentation.go:分别取自InvitationId、InvitedEmailAddress、State、CreationTime字段,输出前经sanitizeTab清洗以保证表格对齐。
2. 按邮箱与状态组合过滤
gog classroom guardian-invitations list student-id-123 \ --email guardian@example.com \ --state pending,complete服务端会同时应用邮箱过滤与状态过滤;状态值不区分大小写。
3. 拉取全部结果并限制单页大小
gog classroom guardian-invitations list student-id-123 --all --max 50--all会忽略返回的nextPageToken,在客户端自动翻页直至取完;--max控制每次请求的pageSize。
4. 手动翻页
# 第一页 gog classroom guardian-invitations list student-id-123 --page "" # 用上一页返回的 nextPageToken 取下一页 gog classroom guardian-invitations list student-id-123 --page <nextPageToken>5. 脚本化:JSON 输出 + 空结果检测
gog classroom guardian-invitations list student-id-123 --json --fail-empty if [ $? -eq 3 ]; then echo "no guardian invitations found" fi--fail-empty在无结果时返回退出码 3,便于 CI 或 Shell 脚本做存在性校验。
输出格式与分页行为
表格输出(默认)
无结果时打印No guardian invitations提示;有结果时以表格输出,并在存在下一页时打印继续翻页的提示(--all/--all-pages),逻辑见 internal/cmd/classroom_list_helpers.go。
JSON 输出(-j/--json)
结果以信封结构输出到 stdout:
{ "invitations": [ { "invitationId": "gi1", "invitedEmailAddress": "guardian@example.com", "state": "PENDING", "creationTime": "2024-01-01T00:00:00Z" } ], "nextPageToken": "gip" }顶层键invitations为结果数组,nextPageToken为翻页游标(见 internal/cmd/classroom_list_helpers.go)。如需只输出主结果、丢弃信封字段,可加--results-only。
其他常用全局 flag
-p/--plain/--tsv:输出稳定的 TSV 纯文本,无颜色,适合解析;--select/--pick/--project:JSON 模式下按逗号分隔字段挑选输出(支持点路径);--max必须大于 0,否则返回max must be > 0的用法错误(见 internal/cmd/classroom_list_helpers.go);--account/--acct:指定账户邮箱、别名或auto;--client:指定 OAuth 客户端名称;--access-token:直接使用访问令牌(绕过存储的刷新令牌,令牌约 1 小时过期);--readonly:运行时拦截所有变更类 API 请求;--gmail-no-send用于阻断 Gmail 发送(agent 安全场景);--no-input:禁止交互提示,失败即退出,适合 CI;--home:覆盖 gogcli 配置/数据/状态/缓存根目录(等价于GOG_HOME)。
底层实现:一次 list 调用经历了什么
该命令的核心执行路径集中在两个文件:
- 参数定义与 API 调用:internal/cmd/classroom_guardians.go 中的
Run方法构造classroomPagedListOptions,在fetch闭包内调用svc.UserProfiles.GuardianInvitations.List(studentID).PageSize(pageSize).Context(ctx),并按需追加PageToken、InvitedEmailAddress、States过滤条件,最后执行Do()发起 HTTP 请求并返回resp.GuardianInvitations与resp.NextPageToken。 - 分页与输出编排:internal/cmd/classroom_list_helpers.go 中的
runClassroomPagedList负责校验参数、调用loadPagedItems完成单页或全量翻页,再交给writeClassroomPagedList统一处理表格/JSON 输出与空结果逻辑。loadPagedItems在--all时通过collectAllPages循环取完所有页(见 internal/cmd/paged_list_helpers.go)。
测试用例:命令行为如何被验证
仓库通过 httptest 模拟 Classroom API 来验证该命令的完整链路。在 internal/cmd/execute_classroom_more_commands_test.go 中,mock 服务器根据路径/userProfiles/.../guardianInvitations与 HTTP 方法分发响应:GET 列表返回guardianInvitations数组与nextPageToken,GET 单条返回invitationId等字段,POST 创建返回新邀请。测试随后以--email、--state、--max、--page等参数组合运行 JSON 模式(见 internal/cmd/execute_classroom_more_commands_test.go),同时覆盖--max 0、--max -1等非法参数的错误路径。
表格渲染同样有独立单测:internal/cmd/classroom_presentation_test.go 断言INVITATION_ID / EMAIL / STATE / CREATED四列的纯文本输出格式与字段映射完全一致,确保默认人读输出稳定可解析。
相关命令与延伸阅读
- 创建监护人邀请:gog classroom guardian-invitations create
- 查询单条邀请:gog classroom guardian-invitations get
- 已确认的监护人管理:gog classroom guardians
- Classroom 命令树总览:gog classroom
- 全部命令索引:命令索引
【免费下载链接】gogcliGoogle Workspace in your terminal.项目地址: https://gitcode.com/GitHub_Trending/gogcl/gogcli
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考