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) }