feat: surface SCUM vehicle functional state
This commit is contained in:
@@ -78,6 +78,7 @@ var scumTableDDL = []struct {
|
||||
display_name VARCHAR(191) NOT NULL DEFAULT '',
|
||||
exists_in_game BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
locked BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
functional BOOLEAN NULL,
|
||||
x DOUBLE NULL,
|
||||
y DOUBLE NULL,
|
||||
z DOUBLE NULL,
|
||||
@@ -136,6 +137,23 @@ func (store *MySQLStore) initializeSCUMTables(ctx context.Context) error {
|
||||
return fmt.Errorf("create SCUM table %s: %w", entry.table, err)
|
||||
}
|
||||
}
|
||||
if err := store.ensureSCUMVehicleFunctionalColumn(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (store *MySQLStore) ensureSCUMVehicleFunctionalColumn(ctx context.Context) error {
|
||||
var found int
|
||||
if err := store.db.QueryRowContext(ctx, `SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'scum_vehicle' AND COLUMN_NAME = 'functional'`).Scan(&found); err != nil {
|
||||
return fmt.Errorf("inspect SCUM vehicle functional column: %w", err)
|
||||
}
|
||||
if found > 0 {
|
||||
return nil
|
||||
}
|
||||
if _, err := store.db.ExecContext(ctx, `ALTER TABLE scum_vehicle ADD COLUMN functional BOOLEAN NULL AFTER locked`); err != nil {
|
||||
return fmt.Errorf("add SCUM vehicle functional column: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -268,12 +286,12 @@ func (repository *mysqlSCUMUserRepository) Delete(id string) error {
|
||||
|
||||
type mysqlSCUMVehicleRepository struct{ db *sql.DB }
|
||||
|
||||
const scumVehicleColumns = `id, server_instance_id, game_vehicle_id, vehicle_class, display_name, exists_in_game, locked, x, y, z, last_observed_at, created_at, updated_at`
|
||||
const scumVehicleColumns = `id, server_instance_id, game_vehicle_id, vehicle_class, display_name, exists_in_game, locked, functional, x, y, z, last_observed_at, created_at, updated_at`
|
||||
|
||||
func (repository *mysqlSCUMVehicleRepository) Create(value domain.SCUMVehicle) error {
|
||||
ctx, cancel := scumQueryContext()
|
||||
defer cancel()
|
||||
_, err := repository.db.ExecContext(ctx, `INSERT INTO scum_vehicle (`+scumVehicleColumns+`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)`, scumVehicleArgs(value)...)
|
||||
_, err := repository.db.ExecContext(ctx, `INSERT INTO scum_vehicle (`+scumVehicleColumns+`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)`, scumVehicleArgs(value)...)
|
||||
if err != nil {
|
||||
if isMySQLDuplicateKey(err) {
|
||||
return ErrDuplicate
|
||||
@@ -337,7 +355,7 @@ func (repository *mysqlSCUMVehicleRepository) List(filter domain.SCUMVehicleFilt
|
||||
func (repository *mysqlSCUMVehicleRepository) Update(value domain.SCUMVehicle) error {
|
||||
ctx, cancel := scumQueryContext()
|
||||
defer cancel()
|
||||
result, err := repository.db.ExecContext(ctx, `UPDATE scum_vehicle SET server_instance_id=?, game_vehicle_id=?, vehicle_class=?, display_name=?, exists_in_game=?, locked=?, x=?, y=?, z=?, last_observed_at=?, created_at=?, updated_at=? WHERE id=?`, scumVehicleUpdateArgs(value)...)
|
||||
result, err := repository.db.ExecContext(ctx, `UPDATE scum_vehicle SET server_instance_id=?, game_vehicle_id=?, vehicle_class=?, display_name=?, exists_in_game=?, locked=?, functional=?, x=?, y=?, z=?, last_observed_at=?, created_at=?, updated_at=? WHERE id=?`, scumVehicleUpdateArgs(value)...)
|
||||
if err != nil {
|
||||
return fmt.Errorf("update scum_vehicle: %w", err)
|
||||
}
|
||||
@@ -754,7 +772,7 @@ func scumUserUpdateArgs(value domain.SCUMUser) []any {
|
||||
func scumVehicleArgs(value domain.SCUMVehicle) []any {
|
||||
return []any{
|
||||
value.ID, value.ServerInstanceID, value.GameVehicleID, value.VehicleClass, value.DisplayName,
|
||||
value.Exists, value.Locked, scumFloatValue(value.X), scumFloatValue(value.Y), scumFloatValue(value.Z),
|
||||
value.Exists, value.Locked, value.Functional, scumFloatValue(value.X), scumFloatValue(value.Y), scumFloatValue(value.Z),
|
||||
scumTimeValue(value.LastObservedAt), value.CreatedAt.UTC(), value.UpdatedAt.UTC(),
|
||||
}
|
||||
}
|
||||
@@ -807,7 +825,7 @@ func scanSCUMVehicle(scanner scumRowScanner) (domain.SCUMVehicle, error) {
|
||||
)
|
||||
err := scanner.Scan(
|
||||
&value.ID, &value.ServerInstanceID, &value.GameVehicleID, &value.VehicleClass, &value.DisplayName,
|
||||
&value.Exists, &value.Locked, &x, &y, &z, &lastObservedAt, &value.CreatedAt, &value.UpdatedAt,
|
||||
&value.Exists, &value.Locked, &value.Functional, &x, &y, &z, &lastObservedAt, &value.CreatedAt, &value.UpdatedAt,
|
||||
)
|
||||
if err != nil {
|
||||
return domain.SCUMVehicle{}, err
|
||||
|
||||
Reference in New Issue
Block a user