Änderung: Erweiterung der Taxi-Map-Logik und Verbesserung der Benutzeroberfläche
Änderungen: - Hinzufügung neuer Modelle für TaxiMapTile, TaxiStreetName und TaxiMapTileStreet zur Unterstützung der Tile- und Straßennamen-Logik. - Anpassung der TaxiMap- und TaxiMapService-Logik zur Verwaltung von Tiles und Straßennamen. - Implementierung von Methoden zur Upsert-Logik für Tiles und Straßennamen in der TaxiMapService. - Verbesserung der Benutzeroberfläche in TaxiToolsView.vue zur Anzeige und Bearbeitung von Straßennamen und zusätzlichen Elementen. Diese Anpassungen verbessern die Funktionalität und Benutzererfahrung im Taxi-Minispiel erheblich, indem sie eine detailliertere Verwaltung von Karten und Straßennamen ermöglichen.
This commit is contained in:
@@ -106,6 +106,9 @@ import TaxiGameState from './taxi/taxiGameState.js';
|
||||
import TaxiLevelStats from './taxi/taxiLevelStats.js';
|
||||
import TaxiMapType from './taxi/taxiMapType.js';
|
||||
import TaxiMap from './taxi/taxiMap.js';
|
||||
import TaxiMapTile from './taxi/taxiMapTile.js';
|
||||
import TaxiStreetName from './taxi/taxiStreetName.js';
|
||||
import TaxiMapTileStreet from './taxi/taxiMapTileStreet.js';
|
||||
|
||||
export default function setupAssociations() {
|
||||
// RoomType 1:n Room
|
||||
@@ -801,4 +804,15 @@ export default function setupAssociations() {
|
||||
// Taxi Map associations
|
||||
TaxiMap.belongsTo(TaxiMapType, { foreignKey: 'mapTypeId', as: 'mapType' });
|
||||
TaxiMapType.hasMany(TaxiMap, { foreignKey: 'mapTypeId', as: 'maps' });
|
||||
|
||||
// Tiles
|
||||
TaxiMap.hasMany(TaxiMapTile, { foreignKey: 'mapId', as: 'tiles' });
|
||||
TaxiMapTile.belongsTo(TaxiMap, { foreignKey: 'mapId', as: 'map' });
|
||||
|
||||
// Street name models
|
||||
TaxiMapTileStreet.belongsTo(TaxiMap, { foreignKey: 'map_id', as: 'map' });
|
||||
TaxiMap.hasMany(TaxiMapTileStreet, { foreignKey: 'map_id', as: 'tileStreets' });
|
||||
|
||||
TaxiMapTileStreet.belongsTo(TaxiStreetName, { foreignKey: 'street_name_h_id', as: 'streetNameH' });
|
||||
TaxiMapTileStreet.belongsTo(TaxiStreetName, { foreignKey: 'street_name_v_id', as: 'streetNameV' });
|
||||
}
|
||||
|
||||
@@ -5,14 +5,18 @@ const ChatRight = sequelize.define('ChatRight', {
|
||||
id: {
|
||||
type: DataTypes.INTEGER,
|
||||
primaryKey: true,
|
||||
autoIncrement: true},
|
||||
autoIncrement: true
|
||||
},
|
||||
tr: {
|
||||
type: DataTypes.STRING(32),
|
||||
allowNull: false,
|
||||
unique: true}}, {
|
||||
unique: true
|
||||
}
|
||||
}, {
|
||||
schema: 'chat',
|
||||
tableName: 'rights',
|
||||
timestamps: false,
|
||||
underscored: true});
|
||||
underscored: true
|
||||
});
|
||||
|
||||
export default ChatRight;
|
||||
|
||||
@@ -96,9 +96,7 @@ import Match3UserProgress from './match3/userProgress.js';
|
||||
import Match3UserLevelProgress from './match3/userLevelProgress.js';
|
||||
|
||||
// — Taxi Minigame —
|
||||
import { TaxiGameState, TaxiLevelStats } from './taxi/index.js';
|
||||
import TaxiMap from './taxi/taxiMap.js';
|
||||
import TaxiMapType from './taxi/taxiMapType.js';
|
||||
import { TaxiGameState, TaxiLevelStats, TaxiMapType, TaxiMap, TaxiMapTile, TaxiStreetName, TaxiMapTileStreet } from './taxi/index.js';
|
||||
|
||||
// — Politische Ämter (Politics) —
|
||||
import PoliticalOfficeType from './falukant/type/political_office_type.js';
|
||||
@@ -241,6 +239,9 @@ const models = {
|
||||
TaxiLevelStats,
|
||||
TaxiMap,
|
||||
TaxiMapType,
|
||||
TaxiMapTile,
|
||||
TaxiStreetName,
|
||||
TaxiMapTileStreet,
|
||||
};
|
||||
|
||||
export default models;
|
||||
|
||||
@@ -2,5 +2,8 @@ import TaxiGameState from './taxiGameState.js';
|
||||
import TaxiLevelStats from './taxiLevelStats.js';
|
||||
import TaxiMapType from './taxiMapType.js';
|
||||
import TaxiMap from './taxiMap.js';
|
||||
import TaxiMapTile from './taxiMapTile.js';
|
||||
import TaxiStreetName from './taxiStreetName.js';
|
||||
import TaxiMapTileStreet from './taxiMapTileStreet.js';
|
||||
|
||||
export { TaxiGameState, TaxiLevelStats, TaxiMapType, TaxiMap };
|
||||
export { TaxiGameState, TaxiLevelStats, TaxiMapType, TaxiMap, TaxiMapTile, TaxiStreetName, TaxiMapTileStreet };
|
||||
|
||||
@@ -41,20 +41,12 @@ const TaxiGameState = sequelize.define('TaxiGameState', {
|
||||
allowNull: false,
|
||||
defaultValue: []
|
||||
},
|
||||
createdAt: {
|
||||
type: DataTypes.DATE,
|
||||
allowNull: false,
|
||||
defaultValue: DataTypes.NOW
|
||||
},
|
||||
updatedAt: {
|
||||
type: DataTypes.DATE,
|
||||
allowNull: false,
|
||||
defaultValue: DataTypes.NOW
|
||||
}
|
||||
// createdAt/updatedAt via timestamps
|
||||
}, {
|
||||
tableName: 'taxi_game_state',
|
||||
schema: 'taxi',
|
||||
timestamps: true,
|
||||
underscored: true,
|
||||
indexes: [
|
||||
{
|
||||
unique: true,
|
||||
|
||||
@@ -45,20 +45,12 @@ const TaxiLevelStats = sequelize.define('TaxiLevelStats', {
|
||||
allowNull: true,
|
||||
comment: 'Play time in seconds'
|
||||
},
|
||||
createdAt: {
|
||||
type: DataTypes.DATE,
|
||||
allowNull: false,
|
||||
defaultValue: DataTypes.NOW
|
||||
},
|
||||
updatedAt: {
|
||||
type: DataTypes.DATE,
|
||||
allowNull: false,
|
||||
defaultValue: DataTypes.NOW
|
||||
}
|
||||
// createdAt/updatedAt via timestamps
|
||||
}, {
|
||||
tableName: 'taxi_level_stat',
|
||||
schema: 'taxi',
|
||||
timestamps: true,
|
||||
underscored: true,
|
||||
indexes: [
|
||||
{
|
||||
unique: true,
|
||||
|
||||
@@ -38,11 +38,6 @@ const TaxiMap = sequelize.define('TaxiMap', {
|
||||
allowNull: false,
|
||||
comment: 'Reference to TaxiMapType'
|
||||
},
|
||||
mapData: {
|
||||
type: DataTypes.JSON,
|
||||
allowNull: false,
|
||||
comment: '2D array of map type IDs for each tile position'
|
||||
},
|
||||
isActive: {
|
||||
type: DataTypes.BOOLEAN,
|
||||
allowNull: false,
|
||||
@@ -54,20 +49,12 @@ const TaxiMap = sequelize.define('TaxiMap', {
|
||||
defaultValue: false,
|
||||
comment: 'Whether this is the default map for new games'
|
||||
},
|
||||
createdAt: {
|
||||
type: DataTypes.DATE,
|
||||
allowNull: false,
|
||||
defaultValue: DataTypes.NOW
|
||||
},
|
||||
updatedAt: {
|
||||
type: DataTypes.DATE,
|
||||
allowNull: false,
|
||||
defaultValue: DataTypes.NOW
|
||||
}
|
||||
// createdAt/updatedAt via timestamps
|
||||
}, {
|
||||
tableName: 'taxi_map',
|
||||
schema: 'taxi',
|
||||
timestamps: true,
|
||||
underscored: true,
|
||||
indexes: [
|
||||
{
|
||||
fields: ['name']
|
||||
|
||||
44
backend/models/taxi/taxiMapTile.js
Normal file
44
backend/models/taxi/taxiMapTile.js
Normal file
@@ -0,0 +1,44 @@
|
||||
import { DataTypes } from 'sequelize';
|
||||
import { sequelize } from '../../utils/sequelize.js';
|
||||
|
||||
const TaxiMapTile = sequelize.define('TaxiMapTile', {
|
||||
id: {
|
||||
type: DataTypes.INTEGER,
|
||||
primaryKey: true,
|
||||
autoIncrement: true,
|
||||
},
|
||||
mapId: {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false,
|
||||
},
|
||||
x: {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false,
|
||||
},
|
||||
y: {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false,
|
||||
},
|
||||
tileType: {
|
||||
type: DataTypes.STRING(50),
|
||||
allowNull: false,
|
||||
},
|
||||
meta: {
|
||||
type: DataTypes.JSON,
|
||||
allowNull: true,
|
||||
}
|
||||
}, {
|
||||
tableName: 'taxi_map_tile',
|
||||
schema: 'taxi',
|
||||
timestamps: true,
|
||||
underscored: true,
|
||||
indexes: [
|
||||
{ unique: true, fields: ['map_id','x','y'] },
|
||||
{ fields: ['map_id'] },
|
||||
{ fields: ['tile_type'] },
|
||||
]
|
||||
});
|
||||
|
||||
export default TaxiMapTile;
|
||||
|
||||
|
||||
45
backend/models/taxi/taxiMapTileStreet.js
Normal file
45
backend/models/taxi/taxiMapTileStreet.js
Normal file
@@ -0,0 +1,45 @@
|
||||
import { DataTypes } from 'sequelize';
|
||||
import { sequelize } from '../../utils/sequelize.js';
|
||||
|
||||
const TaxiMapTileStreet = sequelize.define('TaxiMapTileStreet', {
|
||||
id: {
|
||||
type: DataTypes.INTEGER,
|
||||
primaryKey: true,
|
||||
autoIncrement: true,
|
||||
},
|
||||
mapId: {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false,
|
||||
},
|
||||
x: {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false,
|
||||
},
|
||||
y: {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false,
|
||||
},
|
||||
streetNameHId: {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: true,
|
||||
},
|
||||
streetNameVId: {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: true,
|
||||
}
|
||||
}, {
|
||||
tableName: 'taxi_map_tile_street',
|
||||
schema: 'taxi',
|
||||
timestamps: true,
|
||||
underscored: true,
|
||||
indexes: [
|
||||
{ unique: true, fields: ['map_id','x','y'] },
|
||||
{ fields: ['map_id'] },
|
||||
{ fields: ['street_name_h_id'] },
|
||||
{ fields: ['street_name_v_id'] }
|
||||
]
|
||||
});
|
||||
|
||||
export default TaxiMapTileStreet;
|
||||
|
||||
|
||||
@@ -26,20 +26,12 @@ const TaxiMapType = sequelize.define('TaxiMapType', {
|
||||
allowNull: false,
|
||||
defaultValue: true
|
||||
},
|
||||
createdAt: {
|
||||
type: DataTypes.DATE,
|
||||
allowNull: false,
|
||||
defaultValue: DataTypes.NOW
|
||||
},
|
||||
updatedAt: {
|
||||
type: DataTypes.DATE,
|
||||
allowNull: false,
|
||||
defaultValue: DataTypes.NOW
|
||||
}
|
||||
// createdAt/updatedAt via timestamps
|
||||
}, {
|
||||
tableName: 'taxi_map_type',
|
||||
schema: 'taxi',
|
||||
timestamps: true,
|
||||
underscored: true,
|
||||
indexes: [
|
||||
{
|
||||
unique: true,
|
||||
|
||||
24
backend/models/taxi/taxiStreetName.js
Normal file
24
backend/models/taxi/taxiStreetName.js
Normal file
@@ -0,0 +1,24 @@
|
||||
import { DataTypes } from 'sequelize';
|
||||
import { sequelize } from '../../utils/sequelize.js';
|
||||
|
||||
const TaxiStreetName = sequelize.define('TaxiStreetName', {
|
||||
id: {
|
||||
type: DataTypes.INTEGER,
|
||||
primaryKey: true,
|
||||
autoIncrement: true,
|
||||
},
|
||||
name: {
|
||||
type: DataTypes.STRING(255),
|
||||
allowNull: false,
|
||||
unique: true,
|
||||
}
|
||||
}, {
|
||||
tableName: 'taxi_street_name',
|
||||
schema: 'taxi',
|
||||
timestamps: true,
|
||||
underscored: true,
|
||||
});
|
||||
|
||||
export default TaxiStreetName;
|
||||
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
import BaseService from './BaseService.js';
|
||||
import TaxiMap from '../models/taxi/taxiMap.js';
|
||||
import TaxiMapType from '../models/taxi/taxiMapType.js';
|
||||
import TaxiMapTile from '../models/taxi/taxiMapTile.js';
|
||||
import TaxiStreetName from '../models/taxi/taxiStreetName.js';
|
||||
import TaxiMapTileStreet from '../models/taxi/taxiMapTileStreet.js';
|
||||
|
||||
class TaxiMapService extends BaseService {
|
||||
constructor() {
|
||||
@@ -30,10 +33,18 @@ class TaxiMapService extends BaseService {
|
||||
try {
|
||||
const maps = await TaxiMap.findAll({
|
||||
where: { isActive: true },
|
||||
include: [{
|
||||
model: TaxiMapType,
|
||||
as: 'mapType'
|
||||
}],
|
||||
include: [
|
||||
{ model: TaxiMapType, as: 'mapType' },
|
||||
{ model: TaxiMapTile, as: 'tiles' },
|
||||
{
|
||||
model: TaxiMapTileStreet,
|
||||
as: 'tileStreets',
|
||||
include: [
|
||||
{ model: TaxiStreetName, as: 'streetNameH' },
|
||||
{ model: TaxiStreetName, as: 'streetNameV' }
|
||||
]
|
||||
}
|
||||
],
|
||||
order: [['name', 'ASC']]
|
||||
});
|
||||
return maps;
|
||||
@@ -53,10 +64,18 @@ class TaxiMapService extends BaseService {
|
||||
id: mapId,
|
||||
isActive: true
|
||||
},
|
||||
include: [{
|
||||
model: TaxiMapType,
|
||||
as: 'mapType'
|
||||
}]
|
||||
include: [
|
||||
{ model: TaxiMapType, as: 'mapType' },
|
||||
{ model: TaxiMapTile, as: 'tiles' },
|
||||
{
|
||||
model: TaxiMapTileStreet,
|
||||
as: 'tileStreets',
|
||||
include: [
|
||||
{ model: TaxiStreetName, as: 'streetNameH' },
|
||||
{ model: TaxiStreetName, as: 'streetNameV' }
|
||||
]
|
||||
}
|
||||
]
|
||||
});
|
||||
return map;
|
||||
} catch (error) {
|
||||
@@ -93,8 +112,18 @@ class TaxiMapService extends BaseService {
|
||||
*/
|
||||
async createMap(mapData) {
|
||||
try {
|
||||
const map = await TaxiMap.create(mapData);
|
||||
return map;
|
||||
const { tiles, tileStreetNames, ...mapFields } = mapData;
|
||||
// mapData JSON ist entfernt – map erstellen ohne mapData
|
||||
const map = await TaxiMap.create(mapFields);
|
||||
// Tiles upsert (optional)
|
||||
if (Array.isArray(tiles) && tiles.length > 0) {
|
||||
await this.upsertTiles(map.id, tiles);
|
||||
}
|
||||
// Street names (optional)
|
||||
if (tileStreetNames && Object.keys(tileStreetNames).length > 0) {
|
||||
await this.upsertTileStreetNames(map.id, tileStreetNames);
|
||||
}
|
||||
return await this.getMapById(map.id);
|
||||
} catch (error) {
|
||||
console.error('Error creating map:', error);
|
||||
throw error;
|
||||
@@ -106,7 +135,8 @@ class TaxiMapService extends BaseService {
|
||||
*/
|
||||
async updateMap(mapId, updateData) {
|
||||
try {
|
||||
const [updatedRowsCount] = await TaxiMap.update(updateData, {
|
||||
const { tiles, tileStreetNames, ...mapFields } = updateData;
|
||||
const [updatedRowsCount] = await TaxiMap.update(mapFields, {
|
||||
where: { id: mapId }
|
||||
});
|
||||
|
||||
@@ -114,6 +144,13 @@ class TaxiMapService extends BaseService {
|
||||
throw new Error('Map not found');
|
||||
}
|
||||
|
||||
// Tiles upsert (optional)
|
||||
if (Array.isArray(tiles)) {
|
||||
await this.upsertTiles(mapId, tiles);
|
||||
}
|
||||
if (tileStreetNames && Object.keys(tileStreetNames).length > 0) {
|
||||
await this.upsertTileStreetNames(mapId, tileStreetNames);
|
||||
}
|
||||
return await this.getMapById(mapId);
|
||||
} catch (error) {
|
||||
console.error('Error updating map:', error);
|
||||
@@ -121,6 +158,53 @@ class TaxiMapService extends BaseService {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Speichert Straßennamen-Belegungen für eine Map
|
||||
* @param {number} mapId
|
||||
* @param {{[cellKey:string]:{streetNameH?:string, streetNameV?:string}}} tileNames
|
||||
*/
|
||||
async upsertTileStreetNames(mapId, tileNames) {
|
||||
const entries = Object.entries(tileNames || {});
|
||||
for (const [cellKey, data] of entries) {
|
||||
const [x, y] = cellKey.split(',').map(Number);
|
||||
const record = { mapId, x, y };
|
||||
// Street names: findOrCreate
|
||||
if (data.streetNameH) {
|
||||
const [snH] = await TaxiStreetName.findOrCreate({ where: { name: data.streetNameH }, defaults: { name: data.streetNameH } });
|
||||
record.streetNameHId = snH.id;
|
||||
} else {
|
||||
record.streetNameHId = null;
|
||||
}
|
||||
if (data.streetNameV) {
|
||||
const [snV] = await TaxiStreetName.findOrCreate({ where: { name: data.streetNameV }, defaults: { name: data.streetNameV } });
|
||||
record.streetNameVId = snV.id;
|
||||
} else {
|
||||
record.streetNameVId = null;
|
||||
}
|
||||
|
||||
const [row] = await TaxiMapTileStreet.findOrCreate({ where: { mapId, x, y }, defaults: record });
|
||||
await row.update(record);
|
||||
}
|
||||
return { success: true };
|
||||
}
|
||||
|
||||
/**
|
||||
* Upsert Tiles (x,y,tileType,meta?) pro Map
|
||||
* Erwartet: tiles: Array<{x:number,y:number,tileType:string, meta?:object}>
|
||||
*/
|
||||
async upsertTiles(mapId, tiles) {
|
||||
for (const tile of tiles) {
|
||||
const { x, y, tileType, meta } = tile;
|
||||
if (typeof x !== 'number' || typeof y !== 'number' || !tileType) continue;
|
||||
const [row] = await TaxiMapTile.findOrCreate({
|
||||
where: { mapId, x, y },
|
||||
defaults: { mapId, x, y, tileType, meta: meta || null }
|
||||
});
|
||||
await row.update({ tileType, meta: meta || null });
|
||||
}
|
||||
return { success: true };
|
||||
}
|
||||
|
||||
/**
|
||||
* Löscht eine Map (soft delete)
|
||||
*/
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// initializeTaxi.js
|
||||
|
||||
import TaxiMapService from '../services/taxiMapService.js';
|
||||
import { sequelize } from './sequelize.js';
|
||||
|
||||
const initializeTaxi = async () => {
|
||||
try {
|
||||
@@ -8,6 +9,85 @@ const initializeTaxi = async () => {
|
||||
|
||||
const taxiMapService = new TaxiMapService();
|
||||
|
||||
// Stelle sicher, dass die neue Tabelle taxi_map_tile existiert (vor Zugriffen)
|
||||
try {
|
||||
await (await import('../models/taxi/taxiMapTile.js')).default.sync({ alter: true, force: false });
|
||||
console.log('✅ Tabelle taxi.taxi_map_tile ist synchronisiert');
|
||||
} catch (e) {
|
||||
console.warn('⚠️ Konnte taxi_map_tile nicht synchronisieren:', e?.message || e);
|
||||
}
|
||||
|
||||
// Stelle sicher: timestamps-Spalten in taxi_street_name vorhanden (ältere DBs hatten evtl. kein updated_at)
|
||||
try {
|
||||
await sequelize.query(`
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = 'taxi' AND table_name = 'taxi_street_name' AND column_name = 'created_at'
|
||||
) THEN
|
||||
ALTER TABLE taxi.taxi_street_name ADD COLUMN created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW();
|
||||
END IF;
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = 'taxi' AND table_name = 'taxi_street_name' AND column_name = 'updated_at'
|
||||
) THEN
|
||||
ALTER TABLE taxi.taxi_street_name ADD COLUMN updated_at TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW();
|
||||
END IF;
|
||||
END
|
||||
$$;
|
||||
`);
|
||||
console.log('✅ timestamps-Spalten für taxi.taxi_street_name sichergestellt');
|
||||
} catch (e) {
|
||||
console.warn('⚠️ Konnte timestamps-Spalten für taxi.taxi_street_name nicht sicherstellen:', e?.message || e);
|
||||
}
|
||||
|
||||
// Stelle sicher: timestamps-Spalten in taxi_map_tile_street vorhanden
|
||||
try {
|
||||
await sequelize.query(`
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = 'taxi' AND table_name = 'taxi_map_tile_street' AND column_name = 'created_at'
|
||||
) THEN
|
||||
ALTER TABLE taxi.taxi_map_tile_street ADD COLUMN created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW();
|
||||
END IF;
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = 'taxi' AND table_name = 'taxi_map_tile_street' AND column_name = 'updated_at'
|
||||
) THEN
|
||||
ALTER TABLE taxi.taxi_map_tile_street ADD COLUMN updated_at TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW();
|
||||
END IF;
|
||||
END
|
||||
$$;
|
||||
`);
|
||||
console.log('✅ timestamps-Spalten für taxi.taxi_map_tile_street sichergestellt');
|
||||
} catch (e) {
|
||||
console.warn('⚠️ Konnte timestamps-Spalten für taxi.taxi_map_tile_street nicht sicherstellen:', e?.message || e);
|
||||
}
|
||||
|
||||
// Entferne veraltete Spalte taxi.taxi_map.map_data (Übergang von JSON → relational)
|
||||
try {
|
||||
const exists = await sequelize.query(
|
||||
`SELECT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = 'taxi'
|
||||
AND table_name = 'taxi_map'
|
||||
AND column_name = 'map_data'
|
||||
) AS exists;`,
|
||||
{ type: sequelize.QueryTypes.SELECT }
|
||||
);
|
||||
const hasColumn = Array.isArray(exists) ? (exists[0]?.exists === true || exists[0]?.exists === 't') : false;
|
||||
if (hasColumn) {
|
||||
console.log('🔧 Entferne veraltete Spalte taxi.taxi_map.map_data ...');
|
||||
await sequelize.query(`ALTER TABLE taxi.taxi_map DROP COLUMN IF EXISTS map_data;`);
|
||||
console.log('✅ Spalte map_data entfernt');
|
||||
}
|
||||
} catch (e) {
|
||||
console.warn('⚠️ Konnte Spalte map_data nicht prüfen/entfernen (nicht kritisch):', e?.message || e);
|
||||
}
|
||||
|
||||
// Initialisiere Map-Typen
|
||||
console.log('Initializing taxi map types...');
|
||||
await taxiMapService.initializeMapTypes();
|
||||
|
||||
@@ -121,7 +121,7 @@ const checkSchemaUpdates = async (models) => {
|
||||
const schemas = [
|
||||
'community', 'logs', 'type', 'service', 'forum',
|
||||
'falukant_data', 'falukant_type', 'falukant_predefine', 'falukant_log',
|
||||
'chat', 'match3'
|
||||
'chat', 'match3', 'taxi'
|
||||
];
|
||||
|
||||
let needsUpdate = false;
|
||||
|
||||
Reference in New Issue
Block a user