From 03ea1cf72670aeaef057e39d87a0bc61756c2c63 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 28 May 2025 17:03:36 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B2=D0=B0=D1=88=D0=B5=20=D1=81=D0=BE=D0=BE?= =?UTF-8?q?=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BC=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/db/migrations/027_fix_preferred_language_type.sql | 3 +++ backend/routes/users.js | 8 +++++--- frontend/src/components/ContactDetails.vue | 5 ++++- 3 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 backend/db/migrations/027_fix_preferred_language_type.sql diff --git a/backend/db/migrations/027_fix_preferred_language_type.sql b/backend/db/migrations/027_fix_preferred_language_type.sql new file mode 100644 index 0000000..698abb7 --- /dev/null +++ b/backend/db/migrations/027_fix_preferred_language_type.sql @@ -0,0 +1,3 @@ +-- Исправление preferred_language: если строка — преобразовать в массив, если null — в [] +UPDATE users SET preferred_language = jsonb_build_array(preferred_language) WHERE jsonb_typeof(preferred_language) = 'string'; +UPDATE users SET preferred_language = '[]' WHERE preferred_language IS NULL; \ No newline at end of file diff --git a/backend/routes/users.js b/backend/routes/users.js index 3f1afd3..cde3cec 100644 --- a/backend/routes/users.js +++ b/backend/routes/users.js @@ -95,7 +95,7 @@ router.put('/profile', requireAuth, async (req, res) => { // Получение списка пользователей с контактами router.get('/', async (req, res, next) => { try { - const usersResult = await db.getQuery()('SELECT id, first_name, last_name, created_at FROM users ORDER BY id'); + const usersResult = await db.getQuery()('SELECT id, first_name, last_name, created_at, preferred_language FROM users ORDER BY id'); const users = usersResult.rows; // Получаем все user_identities разом const identitiesResult = await db.getQuery()('SELECT user_id, provider, provider_id FROM user_identities'); @@ -113,7 +113,8 @@ router.get('/', async (req, res, next) => { email: identityMap[u.id]?.email || null, telegram: identityMap[u.id]?.telegram || null, wallet: identityMap[u.id]?.wallet || null, - created_at: u.created_at + created_at: u.created_at, + preferred_language: u.preferred_language || [] })); res.json({ success: true, contacts }); } catch (error) { @@ -157,13 +158,14 @@ router.patch('/:id', async (req, res) => { } if (language !== undefined) { fields.push(`preferred_language = $${idx++}`); - values.push(Array.isArray(language) ? JSON.stringify(language) : language); + values.push(JSON.stringify(language)); } values.push(userId); const sql = `UPDATE users SET ${fields.join(', ')} WHERE id = $${idx} RETURNING *`; const result = await db.getQuery()(sql, values); res.json(result.rows[0]); } catch (e) { + logger.error('PATCH /api/users/:id error', { error: e, body: req.body, stack: e.stack }); res.status(500).json({ error: 'DB error', details: e.message }); } }); diff --git a/frontend/src/components/ContactDetails.vue b/frontend/src/components/ContactDetails.vue index cbffd3d..dc294ce 100644 --- a/frontend/src/components/ContactDetails.vue +++ b/frontend/src/components/ContactDetails.vue @@ -91,7 +91,7 @@ const allLanguages = [ { value: 'uk', label: 'Українська' }, { value: 'other', label: 'Другое' } ]; -const selectedLanguages = ref(Array.isArray(props.contact.language) ? props.contact.language : (props.contact.language ? [props.contact.language] : [])); +const selectedLanguages = ref(Array.isArray(props.contact.preferred_language) ? props.contact.preferred_language : (props.contact.preferred_language ? [props.contact.preferred_language] : [])); const langInput = ref(''); const showLangDropdown = ref(false); const filteredLanguages = computed(() => { @@ -169,6 +169,9 @@ async function loadMessages() { } onMounted(loadMessages); watch(() => props.contact, loadMessages); +watch(() => props.contact.preferred_language, (newVal) => { + selectedLanguages.value = Array.isArray(newVal) ? newVal : (newVal ? [newVal] : []); +});