没有……任何 (内定、钦点) 的意思。还是按照香港的……按照 基本法、按照 选举的法——去产生……
GeekApk 是一个曾经 酷友 们自发组织创立的开源应用社区,它崇尚自由,设计时融合了 酷安、Google Play、GitHub、ApkPure、ApkMirror、F-Droid 的优秀设计于一体,目标是成为一个能替代酷安的应用市场兼社区
GeekApk 里有这些模型:
实体:用户、分类、应用、更新、评论
辅助:时间线、通知
GeekApk 还支持 用户 Star 应用、用户 Follow 用户
评论和更新 附加在 应用 上
评论 可以被添加为 评论 的 子评论
- 用户有简易名称(唯一标识)、用户名和 UID、头像链接、自我介绍、创建时间、管理员修改的小黑屋状态
- 分类有自己不可修改的 TID 和管理员修改的名称,一般以
/
切分分类路径 - 应用有 AID(内部使用的唯一标识)、包名(也是唯一标识)、管理员修改的创建用户 ID 引用、管理员修改的所属分类 ID 引用、名称、图标链接、应用描述、预览图像、创建时间、更新时间
- 更新有不可修改的所属应用的 ID 引用、版本名、reversion、安装链接、更新内容、最低适配 SDK 版本、创建时间
- 评论有 CID、不可修改的创建用户的 ID 引用、不可修改的所属应用的 ID 引用、不可修改可空的被回复评论的 ID 引用、内容、更新时间、被回复数、创建时间
- 时间线有所属用户引用、创建时间、类型、数据引用
- 通知有所属用户、创建时间、类型、数据引用、已读状态
models 'GeekApk' do
perm :admin, 'create, delete'
model 'user', :uid do
perm :owner
field :simple_name, 'unique', :string, 'len < 30, match: /([A-Z]|[a-z]|_)*/'
field :name, :string, 'len < 50'
field :avatar, :string, 'len < 500'
field :bio, :string, 'len < 5000'
perm :admin
field :blocked, :bool, 'default false'
perm { all: '!read', owner_shash: 'write' }
field :hash, :string
perm { all: '!read', admin: 'write' }
field :shash, :string
counter 'followers', 'when new follower', 'when unfollow'
perm :restricted
created_field
end
perm :admin, 'create, delete, update'
model 'category', :tid do
perm :admin
field :name, :string
end
perm { admin: 'delete', user: 'create', owner: 'delete, update' }
model 'app', :aid do
perm owner: 'write'
field :package, 'unique', :string, 'len < 200, match: /([A-Z]|[a-z]|_)*/'
perm admin: 'update'
ref 'user', :author
ref 'category', :category
field :name, :string, 'len < 500'
field :icon, :string, 'len < 500'
field :readme, :string, 'len < 9000'
field :previews, :string, 'len < 2000'
counter 'stars', 'when new star', 'when unstar'
counter 'comments', 'when new comment', 'when delete comment'
created_field
updated_field
end
model 'update', 'app' do
ref 'app', :app
field :version, :string, 'len < 40'
field :reversion, :smallint, 'ge 0, index'
field :install, :string, 'len < 2000'
field :updates, :string, 'len < 600'
field :minsdk, :smallint, 'gt 0'
created_field
end
model 'comment', :cid, 'app' do
ref 'user', :author
ref 'app', :app
ref? 'comment', :reply
field :content, :string, 'len < 600'
created_field
updated_field
counter 'replies', 'when replied'
end
model 'timeline', 'user' do
ref 'user', :user
field :type, :smallint
ref ref_line_type(:type), :int
created_field
end
model 'notification', 'user' do
ref 'user', :user
field :type, :smallint
ref ref_notif_type(:type), :int
created_field
field :readed, :bool, 'default false'
end
end
GeekApk 使用 基于角色 的权限制度
GeekApk 中有三种角色:访客、用户、权限狗(Doge)
任何人,包括 用户 和 权限狗,同时也都是访客
所有人都 无权修改 创建时间和实体 ID,系统生成的 时间线 和 通知(除了 已读 字段)不能修改和删除
权限狗是 GeekApk 的管理员,管理员可以
- 管理用户,如创建/删除用户、修改用户分发密码、ban/unban 用户
- 管理分类,如创建修改删除分类
- 删除实体,如删除应用、删除更新、删除评论
- 修改信息,如转移应用、移动应用到新分类
用户是 GeekApk 的普通用户,用户可以
- 管理自我介绍
- 创建/删除和修改自己的应用,但不能移动应用到新分类
- 修改自己是协作者的应用,但不能移动应用到新分类
- 创建/删除和修改自己的/自己是协作者的应用的更新
- 创建评论、删除/修改自己的评论
- 读取和标记已读自己的通知
- (Un)Follow 用户/(Un)Star 应用
作为 GeekApk 访客,我可以
- 获得除了 密码、通知 外所有的 只读权限 "Read Access"
GeekApk HTTP API 使用 Cookie 来验证操作权限
- 权限狗使用
doge
cookie,服务器只有一个命名为DOGE_TOK
的令牌,测试相等性 - 用户使用
uid
和hash
两个 cookie,服务器不会从执行的操作推测你的用户 ID,如果没有权限或验证失败,返回 HTTP 代码 Forbidden 和 Unauthorized - 用户可以使用
shash
(分发密码)URL 参数来重置用户hash
,只有一个 API 能这么做 - 计算密码的 Hash 值过程由客户端执行,服务器只把密码作为字符串看待
- GeekApk 允许应用主添加其他用户作为 Collaborator
Category "Misc"
api version : Text
api server_description : Text
api api_locations
End
Category "Admin"
api create_user(initiate_simple_name: Body) perm doge return uid, rhash
api rhash_user(uid: User, new_shash: Body) perm doge
return new_shash
api delete_user(uid: User) perm doge
api ban_user(uid: User, new_state: Bool) perm doge
return Old_state
api create_category(name: Body) perm doge
return cid
api update_category_name(tid: Category, name: Body) perm doge
return tid, name
api delete_category(tid: Category) perm doge
return tid
api delete_app(aid: App) perm doge
return aid
api change_app_category(aid: App, new_cate: Category) perm doge
return old_category
api change_app_ownership(aid: App, new_owner: User) perm doge
return old_owner
api delete_app_update(aid: App, rev: SmallInt) perm doge
return reversion
api delete_comment(cid: Comment) perm doge
return num_deleted_comments
End
Category "Category"
api get_categories
return categories
End
Category "User"
api get_user(uid: User)
return user
; simple_name、name、avatar、bio
api update_user_att(uid: User, attr: String, new_val: Body) perm owner
allow_banned_user
check_size
return attr, new_var
api update_user_hash(uid: User, shash: String, new_hash: Body) perm everyone
check new hash size > 4
return new_hash
api check_pass(uid: User, hash: String) perm everyone
return OK or Unauthorized
api search_user(type: name/simple_name/bio, sort: created/followers, content: Body)
return Paged<List<User>>
api list_user(sort: created/followers)
return Paged List of User
End
Category "Timeline"
api get_user_timlines(uid: User, only_type: SmallInt, only_ref: Int)
api get_all_timelines(only_type: SmallInt, only_ref: Int)
api bulk_get_user_timline(uids: User[], only_type: SmallInt, only_ref: Int)
End
Category "Notification"
api get_mine_notifications(uid: User) perm owner
api get_all_mine_notifications(uid: User) perm owner
api mark_time_range_notifications(uid: User, start: UnixTime, end: UnixTime, stat: Bool) perm owner
End
Category "App"
api get_app(aid: App)
return app
; package name icon previews readme
api update_app_att(aid: App, attr: String, new_val: Body) perm owner or collab
return attr, new_val
api create_app(package: String, category: Category) perm user
return aid
api search_app(in_category: Category?, content: Body, type: name/package/icon/readme, sort: updated/created/comments/stars)
api aid_realid(package: Text)
return aid
api list_app(in_category: Category?, sort: updated/created/comments/stars)
api delete_app(aid: App) perm owner
; Collaborator
api add_collaborator(uid: User) perm 'owner'
return add collaborator to list
end
api del_collaborator(uid: User) perm 'owner or who uid == param uid'
return delete collaborator from list
end
api query_app_collaborators(app: App)
body list(app collaborators)
return
end
api query_user_collaborated_apps(uid: User)
body list(user collaborated apps)
return
end
End
Category "Update"
api get_app_updates(aid: App)
api bulk_get_new_rev(aids: App[])
api get_update(aid: App, rev: SmallInt)
api create_update(aid: App, rev: SmallInt) perm owner or collab
api update_update_att(aid: App, rev: SmallInt, attr: version/install/updates/minsdk, new_val: Body) perm owner or collab
api delete_update(aid: App, rev: SmallInt) perm owner or collab
End
Category "Comment"
api search(in_app: Option<App>, user: Option<User>, replies_to: Option<Comment>, content: Body) paged
api list_comments(app: App) paged
api list_subcomments(cid: Comment)
api create_comment(app: App, uid: User) perm user
api update_comment(cid: Comment, text: Body) perm owner
api delete_comment(cid: Comment) perm owner
End
Category "Follow"
api follow_user(uid: User) perm user
api unfollow_user(uid: User) perm owner
api get_followers(uid: User)
api get followed(uid: User)
End
Category "Star"
api stat_app(app: App) perm user
api unstar_app(app: App) perm owner
api get_stared_users(app: App)
api get_user_stars(uid: User)
End
- 用户自我介绍
- 应用描述
- 更新内容
- 评论内容
括号内的是 类型 ID,可以在 JSON 和 API 参数里使用
- 用户的评论被回复(
1
) - 用户被 @ 提到(
2
) - 用户被用户跟随(
3
) - 用户被 Ban(
4
) - 用户被 Unban(
5
) - 用户删除了应用(
6
) - 用户被添加为 Collaborator(
7
)
- 用户 跟随 了某个用户(
1
) - 用户 创建 了某个评论(
2
) - 用户 发布 了某个应用(
3
) - 用户 更新 了某个应用(
4
) - 用户 删除 了某个应用(
5
) - 用户 星标 了某个应用(
6
) - 用户 被添加 为 Collaborator(
7
)
- 用户 执行 全站排列或搜索时 可以按照 跟随者数目、创建时间 排序
- 应用 执行 排列或搜索时 可以按照 星标数、评论数、更新时间、创建时间 排序
- 评论 使用创建时间排序
应用 默认使用更新时间排序,其他列出的默认使用 创建时间,没有列出的查询时的不会添加排序参数
所有 需要分页 的请求都可以使用 URL 参数 start
和 limit
,意味着 索引范围 起止(始于 0
、包含最小值,不包含最大值)
limit
将是 SQL LIMIT 语句 后的参数,它对使用分页的请求是 必须 的,start
参数不是必须的,它默认为 0
需要分页的 API 请求返回 JSON 列表 都在 list
字段里,表本身包含 start
、limit
和 total
指示 请求参数 和服务端实际上的结果列表 总长度
如果 start
大于实际上 SQL 查询返回数据的长度,直接返回空列表,不然,返回裁剪过的列表
用户、分类、应用、更新、评论、通知 这些都可以删除,删除后将不会再出现使用 同一 ID 的新实体
用户 只能由 管理员删除,删除时所有他名下的 应用 都会 自动删除,管理员不能拒绝用户删除帐号
如果用户不想让应用随帐号被删除,可以提前将所有权移动到其他用户手上,所有权转交行为是由管理员执行的
被删除用户的 Star 保留、评论全部删除,Following 全部删除,时间线和通知全部删除
应用 删除时自动删除其所有 更新和评论
评论 删除时自动删除其所有 子评论