ваше сообщение коммита

This commit is contained in:
2025-05-28 17:03:36 +03:00
parent 568f2615b9
commit 03ea1cf726
3 changed files with 12 additions and 4 deletions

View File

@@ -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;

View File

@@ -95,7 +95,7 @@ router.put('/profile', requireAuth, async (req, res) => {
// Получение списка пользователей с контактами // Получение списка пользователей с контактами
router.get('/', async (req, res, next) => { router.get('/', async (req, res, next) => {
try { 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; const users = usersResult.rows;
// Получаем все user_identities разом // Получаем все user_identities разом
const identitiesResult = await db.getQuery()('SELECT user_id, provider, provider_id FROM 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, email: identityMap[u.id]?.email || null,
telegram: identityMap[u.id]?.telegram || null, telegram: identityMap[u.id]?.telegram || null,
wallet: identityMap[u.id]?.wallet || 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 }); res.json({ success: true, contacts });
} catch (error) { } catch (error) {
@@ -157,13 +158,14 @@ router.patch('/:id', async (req, res) => {
} }
if (language !== undefined) { if (language !== undefined) {
fields.push(`preferred_language = $${idx++}`); fields.push(`preferred_language = $${idx++}`);
values.push(Array.isArray(language) ? JSON.stringify(language) : language); values.push(JSON.stringify(language));
} }
values.push(userId); values.push(userId);
const sql = `UPDATE users SET ${fields.join(', ')} WHERE id = $${idx} RETURNING *`; const sql = `UPDATE users SET ${fields.join(', ')} WHERE id = $${idx} RETURNING *`;
const result = await db.getQuery()(sql, values); const result = await db.getQuery()(sql, values);
res.json(result.rows[0]); res.json(result.rows[0]);
} catch (e) { } 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 }); res.status(500).json({ error: 'DB error', details: e.message });
} }
}); });

View File

@@ -91,7 +91,7 @@ const allLanguages = [
{ value: 'uk', label: 'Українська' }, { value: 'uk', label: 'Українська' },
{ value: 'other', 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 langInput = ref('');
const showLangDropdown = ref(false); const showLangDropdown = ref(false);
const filteredLanguages = computed(() => { const filteredLanguages = computed(() => {
@@ -169,6 +169,9 @@ async function loadMessages() {
} }
onMounted(loadMessages); onMounted(loadMessages);
watch(() => props.contact, loadMessages); watch(() => props.contact, loadMessages);
watch(() => props.contact.preferred_language, (newVal) => {
selectedLanguages.value = Array.isArray(newVal) ? newVal : (newVal ? [newVal] : []);
});
</script> </script>
<style scoped> <style scoped>