74 lines
1.8 KiB
Go
74 lines
1.8 KiB
Go
package projectinstance
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
|
|
"chat-agent-system/internal/docduty"
|
|
"chat-agent-system/internal/workflowdef"
|
|
)
|
|
|
|
// ActiveMemberLookup 只读在任成员集合。validator 不得直连 DB/HTTP。
|
|
type ActiveMemberLookup interface {
|
|
ActiveMemberIDs(ctx context.Context, projectID int64) (map[int64]struct{}, error)
|
|
}
|
|
|
|
type pgMemberLookup struct {
|
|
pool *pgxpool.Pool
|
|
}
|
|
|
|
func NewPGMemberLookup(pool *pgxpool.Pool) ActiveMemberLookup {
|
|
return &pgMemberLookup{pool: pool}
|
|
}
|
|
|
|
func (l *pgMemberLookup) ActiveMemberIDs(ctx context.Context, projectID int64) (map[int64]struct{}, error) {
|
|
if l == nil || l.pool == nil {
|
|
return map[int64]struct{}{}, nil
|
|
}
|
|
members, creator, err := docduty.LoadProjectMembers(ctx, l.pool, projectID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return docduty.ActiveMemberIDs(members, creator), nil
|
|
}
|
|
|
|
func (s *Service) SetActiveMemberLookup(lookup ActiveMemberLookup) {
|
|
if s == nil {
|
|
return
|
|
}
|
|
s.members = lookup
|
|
}
|
|
|
|
type activateMemberRecheckKey struct{}
|
|
|
|
func withActivateMemberRecheck(ctx context.Context, fn func(context.Context) error) context.Context {
|
|
if fn == nil {
|
|
return ctx
|
|
}
|
|
return context.WithValue(ctx, activateMemberRecheckKey{}, fn)
|
|
}
|
|
|
|
func runActivateMemberRecheck(ctx context.Context) error {
|
|
fn, _ := ctx.Value(activateMemberRecheckKey{}).(func(context.Context) error)
|
|
if fn == nil {
|
|
return nil
|
|
}
|
|
return fn(ctx)
|
|
}
|
|
|
|
func (s *Service) checkActiveMembers(ctx context.Context, projectID int64, plan WorkflowPlan) error {
|
|
if s == nil || s.members == nil {
|
|
return nil
|
|
}
|
|
ids, err := s.members.ActiveMemberIDs(ctx, projectID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
issues := validateActiveMemberDuties(plan, ids)
|
|
if len(issues) == 0 {
|
|
return nil
|
|
}
|
|
return newValidationError(workflowdef.ValidationResult{Valid: false, Issues: issues})
|
|
}
|