From a91658eb31b0710a6e0ebbcc762dd12e5725fa7b Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 22 May 2025 12:12:24 +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/routes/identities.js | 17 + backend/services/identity-service.js | 26 ++ frontend/src/components/Sidebar.vue | 120 ++++++- .../src/components/identity/EmailConnect.vue | 302 +++++++++++++----- .../components/identity/TelegramConnect.vue | 123 +++++++ frontend/src/composables/useAuth.js | 20 ++ frontend/src/router/index.js | 10 + .../src/views/settings/AiSettingsView.vue | 180 +++-------- .../src/views/settings/EmailSettingsView.vue | 72 +++++ .../views/settings/TelegramSettingsView.vue | 62 ++++ 10 files changed, 700 insertions(+), 232 deletions(-) create mode 100644 frontend/src/components/identity/TelegramConnect.vue create mode 100644 frontend/src/views/settings/EmailSettingsView.vue create mode 100644 frontend/src/views/settings/TelegramSettingsView.vue diff --git a/backend/routes/identities.js b/backend/routes/identities.js index 90a4636..b84e336 100644 --- a/backend/routes/identities.js +++ b/backend/routes/identities.js @@ -107,4 +107,21 @@ router.get('/token-balances', requireAuth, async (req, res) => { } }); +// Удаление идентификатора пользователя +router.delete('/:provider/:providerId', requireAuth, async (req, res) => { + try { + const userId = req.session.userId; + const { provider, providerId } = req.params; + const result = await require('../services/identity-service').deleteIdentity(userId, provider, providerId); + if (result.success) { + res.json({ success: true, deleted: result.deleted }); + } else { + res.status(400).json({ success: false, error: result.error }); + } + } catch (error) { + logger.error('Error deleting identity:', error); + res.status(500).json({ error: 'Internal server error' }); + } +}); + module.exports = router; diff --git a/backend/services/identity-service.js b/backend/services/identity-service.js index 75fe11f..ca6cf61 100644 --- a/backend/services/identity-service.js +++ b/backend/services/identity-service.js @@ -495,6 +495,32 @@ class IdentityService { return []; } } + + /** + * Удаляет идентификатор пользователя + * @param {number} userId - ID пользователя + * @param {string} provider - Тип идентификатора + * @param {string} providerId - Значение идентификатора + * @returns {Promise} - Результат операции + */ + async deleteIdentity(userId, provider, providerId) { + try { + if (!userId || !provider || !providerId) { + logger.warn(`[IdentityService] Missing parameters for deleteIdentity: userId=${userId}, provider=${provider}, providerId=${providerId}`); + return { success: false, error: 'Missing required parameters' }; + } + const { provider: normalizedProvider, providerId: normalizedProviderId } = this.normalizeIdentity(provider, providerId); + const result = await db.query( + `DELETE FROM user_identities WHERE user_id = $1 AND provider = $2 AND provider_id = $3`, + [userId, normalizedProvider, normalizedProviderId] + ); + logger.info(`[IdentityService] Deleted identity ${normalizedProvider}:${normalizedProviderId} for user ${userId}`); + return { success: true, deleted: result.rowCount }; + } catch (error) { + logger.error(`[IdentityService] Error deleting identity ${provider}:${providerId} for user ${userId}:`, error); + return { success: false, error: error.message }; + } + } } module.exports = new IdentityService(); diff --git a/frontend/src/components/Sidebar.vue b/frontend/src/components/Sidebar.vue index e084703..7e01257 100644 --- a/frontend/src/components/Sidebar.vue +++ b/frontend/src/components/Sidebar.vue @@ -43,18 +43,60 @@ - -