Skip to content

[bug] 提交repo时下拉框显示他人repo不显示组织repo #158

Description

@Cynthialime

出问题的页面 URL

https://www.synnovator.com/hackathon/opc-2026-shuzhi-w1

你用什么账号操作的?

testtest

复现步骤(一步一行)

1.进入活动页(任意可以报名或者提交的活动)
2.选择repo提交
3.下拉框中显示其他repo

期望看到 / 期望发生的事

repo 选择器应只显示当前用户可合法用于本次参赛/提交的仓库。

应该包含:

当前用户本人名下的仓库
当前用户所属组织、且当前用户有权限代表该组织参赛的仓库
不应该包含:

与当前用户无关的个人仓库
当前用户无权代表提交的其他仓库
如果某次报名已经绑定 repo,则提交阶段应进一步收敛为:

只显示该已绑定 repo
或只显示与该 registration 对应组织/个人身份一致的 repo

实际看到 / 实际发生的事

当前网页端 repo 下拉框存在两个相反方向的问题:

  1. 会出现不应出现的 repo
    用户在下拉框里可以看到别人的 repo,这些 repo 不应作为当前用户的比赛提交候选。

  2. 不会显示自己组织的 repo
    用户已经加入自己的组织,也希望用组织 repo 参赛,但下拉框里看不到该组织 repo。

这使得组织参赛路径在网页端实际不可用或非常混乱。

截图

No response

出现频率

每次都能复现

你在哪个环境测的?

线上 https://www.synnovator.com

浏览器 + 版本(可选)

No response

其他补充(可选)

  1. 页面模板只是渲染 UserRepos
    repo 下拉框来自:

submit.tmpl (line 25)

view.tmpl (line 92)

模板本身没有复杂逻辑,只是把后端传入的 UserRepos 渲染出来。

  1. 后端当前查询条件偏向“当前用户个人 repo”
    报名页和提交页加载 repo 列表时,使用了类似逻辑:

hackathon.go (line 277)

hackathon.go (line 482)

核心条件包括:

Actor = ctx.Doer

OwnerID = ctx.Doer.ID

Private = true

Collaborate = false

从页面意图看,这段逻辑更像是在取:

“当前用户自己的 repo”

但这就解释了为什么:

组织 repo 不会显示

因为组织 repo 的 owner_id 不是当前用户,而是组织

  1. 底层 SearchRepositoryCondition 又让语义变得不稳定
    底层条件构造在:

repo_list.go (line 326)

这里 OwnerID、Actor、Private、Collaborate 的组合语义比较复杂,不完全等同于“只查 owner_id = 当前用户”。

所以当前实现可能同时造成两种问题:

一方面组织 repo 被排除在外

另一方面某些“当前用户可见/可访问”的仓库又被意外混入

也就是:

候选集既不完整,也不干净。

可能的根因
根因 1:页面使用了错误的仓库集合定义
比赛报名/提交页真正需要的是:

“当前用户可代表参赛主体提交的仓库集合”

而不是:

当前用户自己拥有的仓库集合

或当前用户一般可访问的仓库集合

根因 2:个人参赛和组织参赛没有拆开建模
当前页面 repo 下拉框没有清楚区分:

个人报名

组织报名

因此在组织场景下,候选 repo 的逻辑失真:

个人 repo 规则不适合组织参赛

通用 repo 搜索也不适合直接拿来当比赛候选集

建议修复方向
建议把 hackathon 报名/提交页的 repo 候选集改成显式按参赛身份构造:

报名阶段
如果用户以个人身份参赛:

只显示当前用户个人 repo

如果用户以组织身份参赛:

显示当前用户所属、且允许其代表参赛的组织 repo

提交阶段
如果 registration 已经绑定 repo:

只显示该 repo

或只允许在同一参赛身份范围内选择 repo

不建议
不要直接把通用 SearchRepository 结果作为比赛候选集直接渲染。

建议增加测试用例
用户只参加个人赛时,只能看到自己的个人 repo
用户加入组织后,可以看到自己组织的 repo
用户不会看到无关用户的个人 repo
用户组织报名后,提交页 repo 候选集与组织身份一致
已绑定 repo 的 registration,在提交阶段只显示或锁定该 repo

影响
这个问题直接影响:

组织参赛是否能顺畅进行

用户是否能正确理解平台权限和提交流程

比赛提交物归属是否准确

页面是否会误导用户选择错误 repo

从体验上看,当前状态会让用户产生两个困惑:

为什么我能看到别人的 repo?

为什么我自己的组织 repo 反而选不到?

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions