feat: add commands for managing organizations and users
Introduce `AddUserToOrganization`, `RemoveAPIKey`, and `RemoveOrganization` commands to enhance organization management. Implement validation for user addition and API key removal. Update GraphQL schema to support new mutations and add caching for the new events, ensuring that organizations and their relationships are accurately represented in the cache.
This commit is contained in:
@@ -34,6 +34,37 @@ func (a AddOrganization) Event(context.Context) eventsourced.Event {
|
||||
|
||||
var _ eventsourced.Command = AddOrganization{}
|
||||
|
||||
type AddUserToOrganization struct {
|
||||
UserId string
|
||||
Initiator string
|
||||
}
|
||||
|
||||
func (a AddUserToOrganization) Validate(_ context.Context, aggregate eventsourced.Aggregate) error {
|
||||
if aggregate.Identity() == nil {
|
||||
return fmt.Errorf("organization does not exist")
|
||||
}
|
||||
if len(a.UserId) == 0 {
|
||||
return fmt.Errorf("userId is required")
|
||||
}
|
||||
// Check if user is already in the organization
|
||||
org := aggregate.(*Organization)
|
||||
for _, user := range org.Users {
|
||||
if user == a.UserId {
|
||||
return fmt.Errorf("user is already a member of this organization")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (a AddUserToOrganization) Event(context.Context) eventsourced.Event {
|
||||
return &UserAddedToOrganization{
|
||||
UserId: a.UserId,
|
||||
Initiator: a.Initiator,
|
||||
}
|
||||
}
|
||||
|
||||
var _ eventsourced.Command = AddUserToOrganization{}
|
||||
|
||||
type AddAPIKey struct {
|
||||
Name string
|
||||
Key string
|
||||
@@ -79,6 +110,57 @@ func (a AddAPIKey) Event(context.Context) eventsourced.Event {
|
||||
|
||||
var _ eventsourced.Command = AddAPIKey{}
|
||||
|
||||
type RemoveAPIKey struct {
|
||||
KeyName string
|
||||
Initiator string
|
||||
}
|
||||
|
||||
func (r RemoveAPIKey) Validate(_ context.Context, aggregate eventsourced.Aggregate) error {
|
||||
if aggregate.Identity() == nil {
|
||||
return fmt.Errorf("organization does not exist")
|
||||
}
|
||||
org := aggregate.(*Organization)
|
||||
found := false
|
||||
for _, k := range org.APIKeys {
|
||||
if k.Name == r.KeyName {
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
return fmt.Errorf("API key '%s' not found", r.KeyName)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r RemoveAPIKey) Event(context.Context) eventsourced.Event {
|
||||
return &APIKeyRemoved{
|
||||
KeyName: r.KeyName,
|
||||
Initiator: r.Initiator,
|
||||
}
|
||||
}
|
||||
|
||||
var _ eventsourced.Command = RemoveAPIKey{}
|
||||
|
||||
type RemoveOrganization struct {
|
||||
Initiator string
|
||||
}
|
||||
|
||||
func (r RemoveOrganization) Validate(_ context.Context, aggregate eventsourced.Aggregate) error {
|
||||
if aggregate.Identity() == nil {
|
||||
return fmt.Errorf("organization does not exist")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r RemoveOrganization) Event(context.Context) eventsourced.Event {
|
||||
return &OrganizationRemoved{
|
||||
Initiator: r.Initiator,
|
||||
}
|
||||
}
|
||||
|
||||
var _ eventsourced.Command = RemoveOrganization{}
|
||||
|
||||
type UpdateSubGraph struct {
|
||||
OrganizationId string
|
||||
Ref string
|
||||
|
||||
Reference in New Issue
Block a user