diff --git a/internal/app/app.go b/internal/app/app.go index 16ba6ba3..e7a09236 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -220,6 +220,9 @@ func Assemble(cfg *config.Config, svc *bizdev.Service) (*Runtime, error) { }, FeatureValues: sysadminFeatureValues(cfg), }) + if instSvc != nil { + instSvc.SetAuthorOnlyPolicySource(&sysadminAuthorOnlyPolicyAdapter{svc: rt.SysAdmin}) + } rt.DocNotify = &docnotify.Subscriber{Notify: rt.Notify, Docs: parts.Gov} rt.DocNotify.SkipWrite = func(ctx context.Context) bool { return rt.WriterLive(ctx, events.ConsumerNotify) diff --git a/internal/app/author_only_policy_adapter.go b/internal/app/author_only_policy_adapter.go new file mode 100644 index 00000000..958a62ed --- /dev/null +++ b/internal/app/author_only_policy_adapter.go @@ -0,0 +1,38 @@ +package app + +import ( + "context" + + "chat-agent-system/internal/projectinstance" + "chat-agent-system/internal/sysadmin" + + "github.com/jackc/pgx/v5" +) + +// sysadminAuthorOnlyPolicyAdapter 将 sysadmin.AuthorOnlyPolicySource 适配为 +// projectinstance 本地窄接口,避免 projectinstance 反向依赖 sysadmin。 +type sysadminAuthorOnlyPolicyAdapter struct { + svc *sysadmin.Service +} + +func (a *sysadminAuthorOnlyPolicyAdapter) GetAuthorOnlyApprovalPolicy(ctx context.Context) (projectinstance.AuthorOnlyPolicySnapshot, error) { + if a == nil || a.svc == nil { + return projectinstance.AuthorOnlyPolicySnapshot{}, sysadmin.ErrStoreUnavailable + } + pol, err := a.svc.GetAuthorOnlyApprovalPolicy(ctx) + if err != nil { + return projectinstance.AuthorOnlyPolicySnapshot{}, err + } + return projectinstance.AuthorOnlyPolicySnapshot{Allowed: pol.Allowed, Revision: pol.Revision}, nil +} + +func (a *sysadminAuthorOnlyPolicyAdapter) LockAuthorOnlyApprovalPolicy(ctx context.Context, tx pgx.Tx) (projectinstance.AuthorOnlyPolicySnapshot, error) { + if a == nil || a.svc == nil { + return projectinstance.AuthorOnlyPolicySnapshot{}, sysadmin.ErrStoreUnavailable + } + pol, err := a.svc.LockAuthorOnlyApprovalPolicy(ctx, tx) + if err != nil { + return projectinstance.AuthorOnlyPolicySnapshot{}, err + } + return projectinstance.AuthorOnlyPolicySnapshot{Allowed: pol.Allowed, Revision: pol.Revision}, nil +}