74 lines
2.6 KiB
Go
74 lines
2.6 KiB
Go
package service
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"browser.local/platform/domain"
|
|
"browser.local/platform/repo"
|
|
)
|
|
|
|
func (svc *CoreService) ListPluginDataForSession(sessionID string, filter domain.PluginDataFilter) ([]domain.PluginDataRecord, error) {
|
|
if err := svc.authorizePluginData(sessionID, filter.PluginID, filter.ServerInstanceID, filter.Collection); err != nil {
|
|
return nil, err
|
|
}
|
|
values, err := svc.store.PluginDataRecords().List(filter)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if filter.Limit > 0 && len(values) > filter.Limit {
|
|
values = values[:filter.Limit]
|
|
}
|
|
return values, 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
|
|
}
|
|
if strings.TrimSpace(value.Key) == "" {
|
|
return domain.PluginDataRecord{}, validationError("plugin data key is required")
|
|
}
|
|
if value.Value == nil {
|
|
return domain.PluginDataRecord{}, validationError("plugin data value is required")
|
|
}
|
|
value.ID = pluginDataID(value.ServerInstanceID, value.PluginID, value.Collection, value.Key)
|
|
stamp := svc.now()
|
|
existing, err := svc.store.PluginDataRecords().Get(value.ID)
|
|
if err == repo.ErrNotFound {
|
|
value.CreatedAt, value.UpdatedAt = stamp, stamp
|
|
if err := svc.store.PluginDataRecords().Create(value); err != nil {
|
|
return domain.PluginDataRecord{}, err
|
|
}
|
|
return domain.CopyPluginDataRecord(value), nil
|
|
}
|
|
if err != nil {
|
|
return domain.PluginDataRecord{}, err
|
|
}
|
|
existing.Value, existing.UpdatedAt = domain.CopyGameClientBridgePayload(value.Value), stamp
|
|
if err := svc.store.PluginDataRecords().Update(existing); err != nil {
|
|
return domain.PluginDataRecord{}, err
|
|
}
|
|
return domain.CopyPluginDataRecord(existing), nil
|
|
}
|
|
|
|
func (svc *CoreService) authorizePluginData(sessionID, pluginID, serverInstanceID, collection string) error {
|
|
if strings.TrimSpace(pluginID) == "" || strings.TrimSpace(serverInstanceID) == "" || strings.TrimSpace(collection) == "" {
|
|
return validationError("pluginId, serverInstanceId, and collection are required")
|
|
}
|
|
if err := svc.authorizeServerLifecycle(sessionID, serverInstanceID); err != nil {
|
|
return err
|
|
}
|
|
instance, err := svc.store.ServerInstances().Get(serverInstanceID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if instance.PluginID != pluginID {
|
|
return ErrForbidden
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func pluginDataID(serverID, pluginID, collection, key string) string {
|
|
return "plugin-data-" + fingerprintID(serverID, pluginID+"\x00"+collection+"\x00"+key)
|
|
}
|