feat(scum): rebuild plugin-owned management data
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"strings"
|
||||
|
||||
"browser.local/platform/domain"
|
||||
@@ -21,6 +22,65 @@ func (svc *CoreService) ListPluginDataForSession(sessionID string, filter domain
|
||||
return values, nil
|
||||
}
|
||||
|
||||
func (svc *CoreService) DeletePluginDataForSession(sessionID, pluginID, serverInstanceID, collection, key string) error {
|
||||
transaction := domain.PluginDataTransaction{PluginID: pluginID, ServerInstanceID: serverInstanceID, Collection: collection, Mutations: []domain.PluginDataMutation{{Operation: domain.PluginDataMutationDelete, Key: key}}}
|
||||
_, err := svc.ApplyPluginDataTransactionForSession(sessionID, transaction)
|
||||
return err
|
||||
}
|
||||
|
||||
func (svc *CoreService) ApplyPluginDataTransactionForSession(sessionID string, transaction domain.PluginDataTransaction) ([]domain.PluginDataRecord, error) {
|
||||
if err := svc.authorizePluginData(sessionID, transaction.PluginID, transaction.ServerInstanceID, transaction.Collection); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return svc.applyPluginDataTransaction(transaction)
|
||||
}
|
||||
|
||||
func (svc *CoreService) applyPluginDataTransaction(transaction domain.PluginDataTransaction) ([]domain.PluginDataRecord, error) {
|
||||
if len(transaction.Mutations) == 0 {
|
||||
return nil, validationError("plugin data mutations are required")
|
||||
}
|
||||
stamp := svc.now()
|
||||
upserts := make([]domain.PluginDataRecord, 0, len(transaction.Mutations))
|
||||
deleteIDs := make([]string, 0, len(transaction.Mutations))
|
||||
seen := make(map[string]struct{}, len(transaction.Mutations))
|
||||
for _, mutation := range transaction.Mutations {
|
||||
key := strings.TrimSpace(mutation.Key)
|
||||
if key == "" {
|
||||
return nil, validationError("plugin data mutation key is required")
|
||||
}
|
||||
if _, exists := seen[key]; exists {
|
||||
return nil, validationError("plugin data mutation keys must be unique")
|
||||
}
|
||||
seen[key] = struct{}{}
|
||||
id := pluginDataID(transaction.ServerInstanceID, transaction.PluginID, transaction.Collection, key)
|
||||
switch mutation.Operation {
|
||||
case domain.PluginDataMutationPut:
|
||||
if mutation.Value == nil {
|
||||
return nil, validationError("plugin data mutation value is required")
|
||||
}
|
||||
createdAt := stamp
|
||||
if existing, err := svc.store.PluginDataRecords().Get(id); err == nil {
|
||||
createdAt = existing.CreatedAt
|
||||
} else if !errors.Is(err, repo.ErrNotFound) {
|
||||
return nil, err
|
||||
}
|
||||
upserts = append(upserts, domain.PluginDataRecord{ID: id, PluginID: transaction.PluginID, ServerInstanceID: transaction.ServerInstanceID, Collection: transaction.Collection, Key: key, Value: domain.CopyGameClientBridgePayload(mutation.Value), CreatedAt: createdAt, UpdatedAt: stamp})
|
||||
case domain.PluginDataMutationDelete:
|
||||
deleteIDs = append(deleteIDs, id)
|
||||
default:
|
||||
return nil, validationError("plugin data mutation operation is invalid")
|
||||
}
|
||||
}
|
||||
if err := svc.store.PluginDataRecords().Apply(upserts, deleteIDs); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
result := make([]domain.PluginDataRecord, len(upserts))
|
||||
for index, value := range upserts {
|
||||
result[index] = domain.CopyPluginDataRecord(value)
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (svc *CoreService) PutPluginDataForSession(sessionID string, value domain.PluginDataRecord) (domain.PluginDataRecord, error) {
|
||||
if err := svc.authorizePluginData(sessionID, value.PluginID, value.ServerInstanceID, value.Collection); err != nil {
|
||||
return domain.PluginDataRecord{}, err
|
||||
|
||||
Reference in New Issue
Block a user