Remove SCUM sqlite user projections

This commit is contained in:
npc0-hue
2026-09-14 13:41:44 +08:00
parent b1f102bafb
commit ecdca8e28b
76 changed files with 2264 additions and 1558 deletions
+30
View File
@@ -36,6 +36,11 @@ type StoreSnapshot struct {
GameClientBridgeSnapshots []domain.GameClientBridgeSnapshot `json:"gameClientBridgeSnapshots"`
GameClientBridgeStreams []domain.GameClientBridgeSnapshotStream `json:"gameClientBridgeStreams"`
PluginDataRecords []domain.PluginDataRecord `json:"pluginDataRecords"`
SCUMUsers []domain.SCUMUser `json:"scumUsers"`
SCUMUserTrajectories []domain.SCUMUserTrajectory `json:"scumUserTrajectories"`
SCUMVehicles []domain.SCUMVehicle `json:"scumVehicles"`
SCUMVehicleTrajectories []domain.SCUMVehicleTrajectory `json:"scumVehicleTrajectories"`
SCUMVehicleLocks []domain.SCUMVehicleLock `json:"scumVehicleLocks"`
}
type runtimeSnapshot struct {
@@ -168,6 +173,21 @@ func (store *FileStore) GameClientBridgeSnapshotStreams() GameClientBridgeSnapsh
func (store *FileStore) PluginDataRecords() PluginDataRecordRepository {
return &persistentRepository[domain.PluginDataRecord, domain.PluginDataFilter]{repository: store.MemoryStore.pluginDataRecords, persist: store.persist}
}
func (store *FileStore) SCUMUsers() SCUMUserRepository {
return &persistentRepository[domain.SCUMUser, domain.SCUMUserFilter]{repository: store.MemoryStore.scumUsers, persist: store.persist}
}
func (store *FileStore) SCUMUserTrajectories() SCUMUserTrajectoryRepository {
return &persistentRepository[domain.SCUMUserTrajectory, domain.SCUMUserTrajectoryFilter]{repository: store.MemoryStore.scumUserTracks, persist: store.persist}
}
func (store *FileStore) SCUMVehicles() SCUMVehicleRepository {
return &persistentRepository[domain.SCUMVehicle, domain.SCUMVehicleFilter]{repository: store.MemoryStore.scumVehicles, persist: store.persist}
}
func (store *FileStore) SCUMVehicleTrajectories() SCUMVehicleTrajectoryRepository {
return &persistentRepository[domain.SCUMVehicleTrajectory, domain.SCUMVehicleTrajectoryFilter]{repository: store.MemoryStore.scumVehicleTracks, persist: store.persist}
}
func (store *FileStore) SCUMVehicleLocks() SCUMVehicleLockRepository {
return &persistentRepository[domain.SCUMVehicleLock, domain.SCUMVehicleLockFilter]{repository: store.MemoryStore.scumVehicleLocks, persist: store.persist}
}
func (store *FileStore) load() error {
data, err := os.ReadFile(store.path)
if err != nil {
@@ -312,6 +332,11 @@ func (store *FileStore) snapshot() StoreSnapshot {
GameClientBridgeSnapshots: snapshotRepository(store.MemoryStore.bridgeSnapshots.memoryRepository),
GameClientBridgeStreams: snapshotRepository(store.MemoryStore.bridgeStreams),
PluginDataRecords: snapshotRepository(store.MemoryStore.pluginDataRecords),
SCUMUsers: snapshotRepository(store.MemoryStore.scumUsers),
SCUMUserTrajectories: snapshotRepository(store.MemoryStore.scumUserTracks),
SCUMVehicles: snapshotRepository(store.MemoryStore.scumVehicles),
SCUMVehicleTrajectories: snapshotRepository(store.MemoryStore.scumVehicleTracks),
SCUMVehicleLocks: snapshotRepository(store.MemoryStore.scumVehicleLocks),
}
}
@@ -347,6 +372,11 @@ func (store *FileStore) loadSnapshot(snapshot StoreSnapshot) {
loadRepository(store.MemoryStore.bridgeSnapshots.memoryRepository, snapshot.GameClientBridgeSnapshots)
loadRepository(store.MemoryStore.bridgeStreams, snapshot.GameClientBridgeStreams)
loadRepository(store.MemoryStore.pluginDataRecords, snapshot.PluginDataRecords)
loadRepository(store.MemoryStore.scumUsers, snapshot.SCUMUsers)
loadRepository(store.MemoryStore.scumUserTracks, snapshot.SCUMUserTrajectories)
loadRepository(store.MemoryStore.scumVehicles, snapshot.SCUMVehicles)
loadRepository(store.MemoryStore.scumVehicleTracks, snapshot.SCUMVehicleTrajectories)
loadRepository(store.MemoryStore.scumVehicleLocks, snapshot.SCUMVehicleLocks)
}
func (store *FileStore) loadRuntimeSnapshot(snapshot runtimeSnapshot) {
+25
View File
@@ -150,6 +150,21 @@ func (store *MySQLStore) GameClientBridgeSnapshotStreams() GameClientBridgeSnaps
func (store *MySQLStore) PluginDataRecords() PluginDataRecordRepository {
return &persistentRepository[domain.PluginDataRecord, domain.PluginDataFilter]{repository: store.MemoryStore.pluginDataRecords, persist: store.persist}
}
func (store *MySQLStore) SCUMUsers() SCUMUserRepository {
return &persistentRepository[domain.SCUMUser, domain.SCUMUserFilter]{repository: store.MemoryStore.scumUsers, persist: store.persist}
}
func (store *MySQLStore) SCUMUserTrajectories() SCUMUserTrajectoryRepository {
return &persistentRepository[domain.SCUMUserTrajectory, domain.SCUMUserTrajectoryFilter]{repository: store.MemoryStore.scumUserTracks, persist: store.persist}
}
func (store *MySQLStore) SCUMVehicles() SCUMVehicleRepository {
return &persistentRepository[domain.SCUMVehicle, domain.SCUMVehicleFilter]{repository: store.MemoryStore.scumVehicles, persist: store.persist}
}
func (store *MySQLStore) SCUMVehicleTrajectories() SCUMVehicleTrajectoryRepository {
return &persistentRepository[domain.SCUMVehicleTrajectory, domain.SCUMVehicleTrajectoryFilter]{repository: store.MemoryStore.scumVehicleTracks, persist: store.persist}
}
func (store *MySQLStore) SCUMVehicleLocks() SCUMVehicleLockRepository {
return &persistentRepository[domain.SCUMVehicleLock, domain.SCUMVehicleLockFilter]{repository: store.MemoryStore.scumVehicleLocks, persist: store.persist}
}
func (store *MySQLStore) initialize() error {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
@@ -273,6 +288,11 @@ func (store *MySQLStore) snapshot() StoreSnapshot {
GameClientBridgeSnapshots: snapshotRepository(store.MemoryStore.bridgeSnapshots.memoryRepository),
GameClientBridgeStreams: snapshotRepository(store.MemoryStore.bridgeStreams),
PluginDataRecords: snapshotRepository(store.MemoryStore.pluginDataRecords),
SCUMUsers: snapshotRepository(store.MemoryStore.scumUsers),
SCUMUserTrajectories: snapshotRepository(store.MemoryStore.scumUserTracks),
SCUMVehicles: snapshotRepository(store.MemoryStore.scumVehicles),
SCUMVehicleTrajectories: snapshotRepository(store.MemoryStore.scumVehicleTracks),
SCUMVehicleLocks: snapshotRepository(store.MemoryStore.scumVehicleLocks),
}
}
@@ -308,6 +328,11 @@ func (store *MySQLStore) loadSnapshot(snapshot StoreSnapshot) {
loadRepository(store.MemoryStore.bridgeSnapshots.memoryRepository, snapshot.GameClientBridgeSnapshots)
loadRepository(store.MemoryStore.bridgeStreams, snapshot.GameClientBridgeStreams)
loadRepository(store.MemoryStore.pluginDataRecords, snapshot.PluginDataRecords)
loadRepository(store.MemoryStore.scumUsers, snapshot.SCUMUsers)
loadRepository(store.MemoryStore.scumUserTracks, snapshot.SCUMUserTrajectories)
loadRepository(store.MemoryStore.scumVehicles, snapshot.SCUMVehicles)
loadRepository(store.MemoryStore.scumVehicleTracks, snapshot.SCUMVehicleTrajectories)
loadRepository(store.MemoryStore.scumVehicleLocks, snapshot.SCUMVehicleLocks)
}
func (store *MySQLStore) loadRuntimeSnapshot(snapshot runtimeSnapshot) {
+96
View File
@@ -184,6 +184,41 @@ type PluginDataRecordRepository interface {
Apply([]domain.PluginDataRecord, []string) error
}
type SCUMUserRepository interface {
Create(domain.SCUMUser) error
Get(string) (domain.SCUMUser, error)
List(domain.SCUMUserFilter) ([]domain.SCUMUser, error)
Update(domain.SCUMUser) error
}
type SCUMUserTrajectoryRepository interface {
Create(domain.SCUMUserTrajectory) error
Get(string) (domain.SCUMUserTrajectory, error)
List(domain.SCUMUserTrajectoryFilter) ([]domain.SCUMUserTrajectory, error)
Update(domain.SCUMUserTrajectory) error
}
type SCUMVehicleRepository interface {
Create(domain.SCUMVehicle) error
Get(string) (domain.SCUMVehicle, error)
List(domain.SCUMVehicleFilter) ([]domain.SCUMVehicle, error)
Update(domain.SCUMVehicle) error
}
type SCUMVehicleTrajectoryRepository interface {
Create(domain.SCUMVehicleTrajectory) error
Get(string) (domain.SCUMVehicleTrajectory, error)
List(domain.SCUMVehicleTrajectoryFilter) ([]domain.SCUMVehicleTrajectory, error)
Update(domain.SCUMVehicleTrajectory) error
}
type SCUMVehicleLockRepository interface {
Create(domain.SCUMVehicleLock) error
Get(string) (domain.SCUMVehicleLock, error)
List(domain.SCUMVehicleLockFilter) ([]domain.SCUMVehicleLock, error)
Update(domain.SCUMVehicleLock) error
}
type Store interface {
Users() UserRepository
AuthSessions() AuthSessionRepository
@@ -208,6 +243,11 @@ type Store interface {
GameClientBridgeSnapshots() GameClientBridgeSnapshotRepository
GameClientBridgeSnapshotStreams() GameClientBridgeSnapshotStreamRepository
PluginDataRecords() PluginDataRecordRepository
SCUMUsers() SCUMUserRepository
SCUMUserTrajectories() SCUMUserTrajectoryRepository
SCUMVehicles() SCUMVehicleRepository
SCUMVehicleTrajectories() SCUMVehicleTrajectoryRepository
SCUMVehicleLocks() SCUMVehicleLockRepository
}
type MemoryStore struct {
@@ -234,6 +274,11 @@ type MemoryStore struct {
bridgeSnapshots *memoryGameClientBridgeSnapshotRepository
bridgeStreams *memoryRepository[domain.GameClientBridgeSnapshotStream, domain.GameClientBridgeSnapshotStreamFilter]
pluginDataRecords *memoryRepository[domain.PluginDataRecord, domain.PluginDataFilter]
scumUsers *memoryRepository[domain.SCUMUser, domain.SCUMUserFilter]
scumUserTracks *memoryRepository[domain.SCUMUserTrajectory, domain.SCUMUserTrajectoryFilter]
scumVehicles *memoryRepository[domain.SCUMVehicle, domain.SCUMVehicleFilter]
scumVehicleTracks *memoryRepository[domain.SCUMVehicleTrajectory, domain.SCUMVehicleTrajectoryFilter]
scumVehicleLocks *memoryRepository[domain.SCUMVehicleLock, domain.SCUMVehicleLockFilter]
}
func NewMemoryStore() *MemoryStore {
@@ -337,6 +382,11 @@ func NewMemoryStore() *MemoryStore {
matchGameClientBridgeSnapshotStream,
),
pluginDataRecords: newMemoryRepository(func(value domain.PluginDataRecord) string { return value.ID }, domain.CopyPluginDataRecord, matchPluginDataRecord),
scumUsers: newMemoryRepository(func(value domain.SCUMUser) string { return value.ID }, domain.CopySCUMUser, matchSCUMUser),
scumUserTracks: newMemoryRepository(func(value domain.SCUMUserTrajectory) string { return value.ID }, domain.CopySCUMUserTrajectory, matchSCUMUserTrajectory),
scumVehicles: newMemoryRepository(func(value domain.SCUMVehicle) string { return value.ID }, domain.CopySCUMVehicle, matchSCUMVehicle),
scumVehicleTracks: newMemoryRepository(func(value domain.SCUMVehicleTrajectory) string { return value.ID }, domain.CopySCUMVehicleTrajectory, matchSCUMVehicleTrajectory),
scumVehicleLocks: newMemoryRepository(func(value domain.SCUMVehicleLock) string { return value.ID }, domain.CopySCUMVehicleLock, matchSCUMVehicleLock),
}
}
@@ -375,6 +425,15 @@ func (store *MemoryStore) GameClientBridgeSnapshotStreams() GameClientBridgeSnap
func (store *MemoryStore) PluginDataRecords() PluginDataRecordRepository {
return store.pluginDataRecords
}
func (store *MemoryStore) SCUMUsers() SCUMUserRepository { return store.scumUsers }
func (store *MemoryStore) SCUMUserTrajectories() SCUMUserTrajectoryRepository {
return store.scumUserTracks
}
func (store *MemoryStore) SCUMVehicles() SCUMVehicleRepository { return store.scumVehicles }
func (store *MemoryStore) SCUMVehicleTrajectories() SCUMVehicleTrajectoryRepository {
return store.scumVehicleTracks
}
func (store *MemoryStore) SCUMVehicleLocks() SCUMVehicleLockRepository { return store.scumVehicleLocks }
type memoryRepository[T any, F any] struct {
mu sync.RWMutex
@@ -693,3 +752,40 @@ func matchGameClientBridgeSnapshotStream(stream domain.GameClientBridgeSnapshotS
func matchPluginDataRecord(value domain.PluginDataRecord, filter domain.PluginDataFilter) bool {
return (filter.PluginID == "" || value.PluginID == filter.PluginID) && (filter.ServerInstanceID == "" || value.ServerInstanceID == filter.ServerInstanceID) && (filter.Collection == "" || value.Collection == filter.Collection) && (filter.Key == "" || value.Key == filter.Key)
}
func matchSCUMUser(value domain.SCUMUser, filter domain.SCUMUserFilter) bool {
return (filter.ServerInstanceID == "" || value.ServerInstanceID == filter.ServerInstanceID) &&
(filter.SteamID == "" || value.SteamID == filter.SteamID) &&
(filter.Online == nil || value.Online == *filter.Online) &&
(filter.ChangedAfter.IsZero() || value.UpdatedAt.After(filter.ChangedAfter) || value.LastActivityAt.After(filter.ChangedAfter))
}
func matchSCUMUserTrajectory(value domain.SCUMUserTrajectory, filter domain.SCUMUserTrajectoryFilter) bool {
return (filter.ServerInstanceID == "" || value.ServerInstanceID == filter.ServerInstanceID) &&
(filter.SCUMUserID == "" || value.SCUMUserID == filter.SCUMUserID) &&
(filter.SteamID == "" || value.SteamID == filter.SteamID) &&
(filter.After.IsZero() || value.ObservedAt.After(filter.After))
}
func matchSCUMVehicle(value domain.SCUMVehicle, filter domain.SCUMVehicleFilter) bool {
return (filter.ServerInstanceID == "" || value.ServerInstanceID == filter.ServerInstanceID) &&
(filter.GameVehicleID == "" || value.GameVehicleID == filter.GameVehicleID) &&
(filter.Exists == nil || value.Exists == *filter.Exists) &&
(filter.ChangedAfter.IsZero() || value.UpdatedAt.After(filter.ChangedAfter) || value.LastObservedAt.After(filter.ChangedAfter))
}
func matchSCUMVehicleTrajectory(value domain.SCUMVehicleTrajectory, filter domain.SCUMVehicleTrajectoryFilter) bool {
return (filter.ServerInstanceID == "" || value.ServerInstanceID == filter.ServerInstanceID) &&
(filter.SCUMVehicleID == "" || value.SCUMVehicleID == filter.SCUMVehicleID) &&
(filter.GameVehicleID == "" || value.GameVehicleID == filter.GameVehicleID) &&
(filter.After.IsZero() || value.ObservedAt.After(filter.After))
}
func matchSCUMVehicleLock(value domain.SCUMVehicleLock, filter domain.SCUMVehicleLockFilter) bool {
return (filter.ServerInstanceID == "" || value.ServerInstanceID == filter.ServerInstanceID) &&
(filter.SCUMVehicleID == "" || value.SCUMVehicleID == filter.SCUMVehicleID) &&
(filter.GameVehicleID == "" || value.GameVehicleID == filter.GameVehicleID) &&
(filter.SCUMUserID == "" || value.SCUMUserID == filter.SCUMUserID) &&
(filter.SteamID == "" || value.SteamID == filter.SteamID) &&
(filter.After.IsZero() || value.LockedAt.After(filter.After))
}