refactor(host): single-source ChannelPolicy, space-signed file grants, whole-file registration
- all authorization rules (owner/creator, per-channel read/write grants, who may remove whom, delete rules, structure management) live in ChannelPolicy; a test fails if they are reimplemented elsewhere - ChannelInfo carries what the caller may do (can_*), member and invitation lists say who can be removed; clients display it and never derive it - the host no longer stores or calls the file service: it only signs short-lived tickets from space permissions (create/put/get/delete/domain), and keeps an opaque fileDomain reference on the channel - a whole file is registered in one request (last frame header + per-frame length and digest) instead of one request per 1 MiB frame; the signed manifest still has to match every digest - drop file quota/threshold, receipts, reconcile and delete-queue code from the host - contract generator emits constants for enums, error codes, token roles, permissions and share states
This commit is contained in:
1 parent
ccb2c074d6
commit
17638b6e20
36 files changed
+926
-589
No files matched your search
@@ -24,7 +24,8 @@ while (pending.Count > 0)
|
||||
if (type.IsEnum)
|
||||
{
|
||||
var values = type.GetFields(BindingFlags.Public | BindingFlags.Static).Select(f => "'" + (f.GetCustomAttribute<JsonStringEnumMemberNameAttribute>()?.Name ?? f.Name) + "'");
|
||||
output.AppendLine($"export type {type.Name} = {string.Join(" | ", values)};\n");
|
||||
output.AppendLine($"export type {type.Name} = {string.Join(" | ", values)};");
|
||||
output.AppendLine($"export const {type.Name} = {{ {string.Join(", ", type.GetFields(BindingFlags.Public | BindingFlags.Static).Select(f => f.Name + ": '" + (f.GetCustomAttribute<JsonStringEnumMemberNameAttribute>()?.Name ?? f.Name) + "'"))} }} as const;\n");
|
||||
definitions[type.Name] = new JsonObject { ["type"] = "string", ["enum"] = new JsonArray(type.GetFields(BindingFlags.Public | BindingFlags.Static).Select(f => JsonValue.Create(f.GetCustomAttribute<JsonStringEnumMemberNameAttribute>()?.Name ?? f.Name) as JsonNode).ToArray()) };
|
||||
continue;
|
||||
}
|
||||
@@ -46,7 +47,20 @@ while (pending.Count > 0)
|
||||
output.AppendLine("}");
|
||||
definitions[type.Name] = new JsonObject { ["type"] = "object", ["properties"] = properties, ["required"] = required };
|
||||
}
|
||||
var path = Path.Combine(root, "web/src/core-bridge/generated/api.ts");
|
||||
// 不在 DTO 里、但前端要用的取值:错误码、令牌角色、空间权限、分享状态。一律由后端定义、生成常量
|
||||
output.AppendLine("/** 错误响应里的 error 取值 */");
|
||||
output.AppendLine($"export const ErrorCode = {{ {string.Join(", ", Enum.GetValues<ErrorCode>().Select(c => c + ": '" + c.ToWire() + "'"))} }} as const;");
|
||||
output.AppendLine("export type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n");
|
||||
output.AppendLine("/** X-WD-Role 请求头:这次请求出示哪张令牌 */");
|
||||
output.AppendLine($"export const TokenRole = {{ {string.Join(", ", Enum.GetValues<Role>().Where(r => r != Role.None).Select(r => r + ": '" + r.ToString().ToLowerInvariant() + "'"))} }} as const;");
|
||||
output.AppendLine("export type TokenRole = (typeof TokenRole)[keyof typeof TokenRole];\n");
|
||||
output.AppendLine("/** 空间权限(身份组授予) */");
|
||||
output.AppendLine($"export const WorkspacePermission = {{ {string.Join(", ", typeof(WorkspacePermission).GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy).Where(f => f.IsLiteral && f.FieldType == typeof(string) && f.Name != "Colors").Select(f => f.Name + ": '" + f.GetRawConstantValue() + "'"))} }} as const;");
|
||||
output.AppendLine("export type WorkspacePermission = (typeof WorkspacePermission)[keyof typeof WorkspacePermission];\n");
|
||||
output.AppendLine("/** 便捷分享的状态 */");
|
||||
output.AppendLine($"export const ShareState = {{ {string.Join(", ", typeof(ShareState).GetFields(BindingFlags.Public | BindingFlags.Static).Select(f => f.Name + ": '" + f.GetRawConstantValue() + "'"))} }} as const;");
|
||||
output.AppendLine("export type ShareState = (typeof ShareState)[keyof typeof ShareState];");
|
||||
var path = Path.Combine(root, "web/src/api/generated.ts");
|
||||
var text = output.ToString().Replace("\r\n", "\n");
|
||||
if (args.Contains("--check"))
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user