Files
browser/platform/repo/game_client_bridge.go
2026-07-20 16:42:33 +08:00

74 lines
2.8 KiB
Go

package repo
import (
"sort"
"browser.local/platform/domain"
)
type memoryGameClientBridgeCommandRepository struct {
*memoryRepository[domain.GameClientBridgeCommand, domain.GameClientBridgeCommandFilter]
}
func newMemoryGameClientBridgeCommandRepository() *memoryGameClientBridgeCommandRepository {
return &memoryGameClientBridgeCommandRepository{memoryRepository: newMemoryRepository(
func(command domain.GameClientBridgeCommand) string { return command.ID },
domain.CopyGameClientBridgeCommand,
matchGameClientBridgeCommand,
)}
}
func (repository *memoryGameClientBridgeCommandRepository) GetByIdempotency(serverInstanceID, requesterID, commandType, idempotencyKey string) (domain.GameClientBridgeCommand, error) {
values, err := repository.List(domain.GameClientBridgeCommandFilter{ServerInstanceID: serverInstanceID, RequesterID: requesterID, CommandType: commandType, IdempotencyKey: idempotencyKey})
if err != nil {
return domain.GameClientBridgeCommand{}, err
}
if len(values) == 0 {
return domain.GameClientBridgeCommand{}, ErrNotFound
}
return values[0], nil
}
type persistentGameClientBridgeCommandRepository struct {
*persistentRepository[domain.GameClientBridgeCommand, domain.GameClientBridgeCommandFilter]
repository GameClientBridgeCommandRepository
}
func (repository *persistentGameClientBridgeCommandRepository) GetByIdempotency(serverInstanceID, requesterID, commandType, idempotencyKey string) (domain.GameClientBridgeCommand, error) {
return repository.repository.GetByIdempotency(serverInstanceID, requesterID, commandType, idempotencyKey)
}
type memoryGameClientBridgeSnapshotRepository struct {
*memoryRepository[domain.GameClientBridgeSnapshot, domain.GameClientBridgeSnapshotFilter]
}
func newMemoryGameClientBridgeSnapshotRepository() *memoryGameClientBridgeSnapshotRepository {
return &memoryGameClientBridgeSnapshotRepository{memoryRepository: newMemoryRepository(
func(snapshot domain.GameClientBridgeSnapshot) string { return snapshot.ID },
domain.CopyGameClientBridgeSnapshot,
matchGameClientBridgeSnapshot,
)}
}
func (repository *memoryGameClientBridgeSnapshotRepository) List(filter domain.GameClientBridgeSnapshotFilter) ([]domain.GameClientBridgeSnapshot, error) {
limit := filter.Limit
filter.Limit = 0
values, err := repository.memoryRepository.List(filter)
if err != nil {
return nil, err
}
sort.SliceStable(values, func(left, right int) bool {
if !values[left].ObservedAt.Equal(values[right].ObservedAt) {
return values[left].ObservedAt.After(values[right].ObservedAt)
}
if values[left].Sequence != values[right].Sequence {
return values[left].Sequence > values[right].Sequence
}
return values[left].ID < values[right].ID
})
if limit > 0 && len(values) > limit {
values = values[:limit]
}
return values, nil
}