fix(module-key): make module keys standalone MD format with system_key relation
This commit is contained in:
@@ -51,10 +51,17 @@ def _resolve_module_id(db: Session, system_key: str, module_key: str | None) ->
|
||||
system = systems_repo.get_by_key(system_key)
|
||||
if not system:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="system_not_found")
|
||||
target_module_key = f"{system_key}.{module_key}" if module_key else f"{system_key}.__system__"
|
||||
target_module_key = module_key if module_key else f"__system__{system_key}"
|
||||
module = modules_repo.get_by_key(target_module_key)
|
||||
if module and module.system_key != system_key:
|
||||
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="module_system_mismatch")
|
||||
if not module:
|
||||
module = modules_repo.create(module_key=target_module_key, name=target_module_key, status="active")
|
||||
module = modules_repo.create(
|
||||
module_key=target_module_key,
|
||||
system_key=system_key,
|
||||
name=target_module_key,
|
||||
status="active",
|
||||
)
|
||||
return module.id
|
||||
|
||||
|
||||
@@ -77,8 +84,6 @@ def _resolve_scope_ids(db: Session, scope_type: str, scope_id: str) -> tuple[str
|
||||
def _split_module_key(payload_module: str | None) -> str:
|
||||
if not payload_module:
|
||||
return "__system__"
|
||||
if "." in payload_module:
|
||||
return payload_module.split(".", 1)[1]
|
||||
return payload_module
|
||||
|
||||
|
||||
@@ -164,11 +169,12 @@ def list_modules(
|
||||
items, total = modules_repo.list(limit=limit, offset=offset)
|
||||
out = []
|
||||
for i in items:
|
||||
system_key = i.module_key.split(".", 1)[0] if "." in i.module_key else None
|
||||
if i.module_key.startswith("__system__"):
|
||||
continue
|
||||
out.append(
|
||||
ModuleItem(
|
||||
id=i.id,
|
||||
system_key=system_key,
|
||||
system_key=i.system_key,
|
||||
module_key=i.module_key,
|
||||
name=i.name,
|
||||
status=i.status,
|
||||
@@ -188,14 +194,14 @@ def create_module(
|
||||
system = systems_repo.get_by_key(payload.system_key)
|
||||
if not system:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="system_not_found")
|
||||
leaf_module_key = _generate_unique_key("MD", lambda k: modules_repo.get_by_key(f"{payload.system_key}.{k}"))
|
||||
full_module_key = f"{payload.system_key}.{leaf_module_key}"
|
||||
leaf_module_key = _generate_unique_key("MD", modules_repo.get_by_key)
|
||||
row = modules_repo.create(
|
||||
module_key=full_module_key,
|
||||
module_key=leaf_module_key,
|
||||
system_key=payload.system_key,
|
||||
name=payload.name,
|
||||
status=payload.status,
|
||||
)
|
||||
return ModuleItem(id=row.id, system_key=payload.system_key, module_key=row.module_key, name=row.name, status=row.status)
|
||||
return ModuleItem(id=row.id, system_key=row.system_key, module_key=row.module_key, name=row.name, status=row.status)
|
||||
|
||||
|
||||
@router.patch("/modules/{module_key}")
|
||||
@@ -210,8 +216,7 @@ def update_module(
|
||||
if not row:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="module_not_found")
|
||||
row = modules_repo.update(row, name=payload.name, status=payload.status)
|
||||
system_key = row.module_key.split(".", 1)[0] if "." in row.module_key else None
|
||||
return ModuleItem(id=row.id, system_key=system_key, module_key=row.module_key, name=row.name, status=row.status)
|
||||
return ModuleItem(id=row.id, system_key=row.system_key, module_key=row.module_key, name=row.name, status=row.status)
|
||||
|
||||
|
||||
@router.get("/systems/{system_key}/groups")
|
||||
@@ -268,8 +273,7 @@ def list_module_groups(
|
||||
module = modules_repo.get_by_key(module_key)
|
||||
if not module:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="module_not_found")
|
||||
system_key, module_name = module.module_key.split(".", 1) if "." in module.module_key else ("", module.module_key)
|
||||
groups = groups_repo.list_module_groups(system_key, module_name)
|
||||
groups = groups_repo.list_module_groups(module.system_key, module.module_key)
|
||||
return {
|
||||
"items": [
|
||||
GroupRelationItem(group_key=g.group_key, group_name=g.name, status=g.status).model_dump()
|
||||
@@ -289,8 +293,7 @@ def list_module_members(
|
||||
module = modules_repo.get_by_key(module_key)
|
||||
if not module:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="module_not_found")
|
||||
system_key, module_name = module.module_key.split(".", 1) if "." in module.module_key else ("", module.module_key)
|
||||
members = groups_repo.list_module_members(system_key, module_name)
|
||||
members = groups_repo.list_module_members(module.system_key, module.module_key)
|
||||
return {
|
||||
"items": [
|
||||
MemberRelationItem(
|
||||
@@ -614,7 +617,7 @@ def list_permission_group_permissions(
|
||||
PermissionGroupPermissionItem(
|
||||
id=r.id,
|
||||
system=r.system,
|
||||
module=("" if r.module == "__system__" else (r.module if "." in r.module else f"{r.system}.{r.module}")),
|
||||
module="" if r.module == "__system__" else r.module,
|
||||
action=r.action,
|
||||
scope_type=r.scope_type,
|
||||
scope_id=r.scope_id,
|
||||
@@ -636,7 +639,14 @@ def get_permission_group_bindings(
|
||||
if not group:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="group_not_found")
|
||||
snapshot = repo.get_group_binding_snapshot(group.id, group_key)
|
||||
return GroupBindingSnapshot(**snapshot)
|
||||
return GroupBindingSnapshot(
|
||||
group_key=snapshot["group_key"],
|
||||
site_keys=snapshot["site_keys"],
|
||||
system_keys=snapshot["system_keys"],
|
||||
module_keys=[k.split("|", 1)[1] if "|" in k else k for k in snapshot["module_keys"]],
|
||||
member_subs=snapshot["member_subs"],
|
||||
actions=snapshot["actions"],
|
||||
)
|
||||
|
||||
|
||||
@router.put("/permission-groups/{group_key}/bindings", response_model=GroupBindingSnapshot)
|
||||
@@ -669,21 +679,32 @@ def replace_permission_group_bindings(
|
||||
if missing_systems:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"system_not_found:{','.join(missing_systems)}")
|
||||
|
||||
valid_modules = {m.module_key for m in modules_repo.list(limit=10000, offset=0)[0]}
|
||||
all_modules = modules_repo.list(limit=10000, offset=0)[0]
|
||||
valid_modules = {m.module_key for m in all_modules}
|
||||
module_system_lookup = {m.module_key: m.system_key for m in all_modules}
|
||||
missing_modules = [k for k in module_keys if k not in valid_modules]
|
||||
if missing_modules:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"module_not_found:{','.join(missing_modules)}")
|
||||
|
||||
module_pairs = [f"{module_system_lookup[m]}|{m}" for m in module_keys]
|
||||
|
||||
repo.replace_group_bindings(
|
||||
group_id=group.id,
|
||||
site_keys=site_keys,
|
||||
system_keys=system_keys,
|
||||
module_keys=module_keys,
|
||||
module_keys=module_pairs,
|
||||
member_subs=payload.member_subs,
|
||||
actions=payload.actions,
|
||||
)
|
||||
snapshot = repo.get_group_binding_snapshot(group.id, group_key)
|
||||
return GroupBindingSnapshot(**snapshot)
|
||||
return GroupBindingSnapshot(
|
||||
group_key=snapshot["group_key"],
|
||||
site_keys=snapshot["site_keys"],
|
||||
system_keys=snapshot["system_keys"],
|
||||
module_keys=[k.split("|", 1)[1] if "|" in k else k for k in snapshot["module_keys"]],
|
||||
member_subs=snapshot["member_subs"],
|
||||
actions=snapshot["actions"],
|
||||
)
|
||||
|
||||
|
||||
@router.post("/permission-groups", response_model=PermissionGroupItem)
|
||||
|
||||
Reference in New Issue
Block a user