From 73e206be5d9b2b1386167c718a388595ba346333 Mon Sep 17 00:00:00 2001 From: Timofey Date: Tue, 20 May 2025 13:04:50 +0300 Subject: [PATCH] route handler for account/main --- backend/api/account/client/views.py | 2 +- backend/api/urls.py | 4 +- frontend/app/(urls)/account/page.tsx | 30 +- .../app/(urls)/publichnaya-oferta/page.tsx | 324 ++++++++++++++++++ frontend/app/api/account/main/route.ts | 48 ++- frontend/app/api/auth/[...nextauth]/route.ts | 2 +- frontend/components/Footer.tsx | 14 +- 7 files changed, 408 insertions(+), 16 deletions(-) create mode 100644 frontend/app/(urls)/publichnaya-oferta/page.tsx diff --git a/backend/api/account/client/views.py b/backend/api/account/client/views.py index 613a1ec..340a3ef 100644 --- a/backend/api/account/client/views.py +++ b/backend/api/account/client/views.py @@ -36,7 +36,7 @@ class UserDataView(ViewSet): status=status.HTTP_404_NOT_FOUND ) -class AccountActions(ViewSet): +class AccountActionsView(ViewSet): permission_classes = [IsAuthenticated] @action(detail=False, methods=['patch']) diff --git a/backend/api/urls.py b/backend/api/urls.py index 5fbf5eb..21c926f 100644 --- a/backend/api/urls.py +++ b/backend/api/urls.py @@ -8,7 +8,7 @@ LoginViewSet, LogoutView, RefreshTokenView) -from api.account.client.views import UserDataView +from api.account.client.views import UserDataView, AccountActionsView urlpatterns = [ path("v1/faq/", FAQView.as_view(), name='faqMain'), @@ -21,4 +21,6 @@ urlpatterns = [ path("v1/logout", LogoutView.as_view(), name="logout"), path ("v1/user/", UserDataView.as_view({'get': 'user_data'}), name="user"), + + path("v1/account/change_main_data/", AccountActionsView.as_view({'patch':'change_data_main_tab'}), name='change_data_main_tab') ] \ No newline at end of file diff --git a/frontend/app/(urls)/account/page.tsx b/frontend/app/(urls)/account/page.tsx index 8dc3f45..00a82e0 100644 --- a/frontend/app/(urls)/account/page.tsx +++ b/frontend/app/(urls)/account/page.tsx @@ -14,10 +14,12 @@ const validationRules = { lastName: { required: false }, phone_number: { required: true }, email: { required: true }, + country: { required: false }, + city: { required: false }, } const AccountPage = () => { - const { user } = useUserStore() + const { user, setUser } = useUserStore() const { values, handleChange, handleSubmit } = useForm( { @@ -31,10 +33,30 @@ const AccountPage = () => { validationRules, async (values) => { try { - // await updateMainTab(values) + const response = await fetch('/api/account/main', { + method: 'PATCH', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(values), + }) + + if (!response.ok) { + const error = await response.json() + throw new Error(error.error || 'Ошибка при обновлении данных') + } + + const result = await response.json() + setUser(result.user) showToast({ type: 'success', message: 'Данные успешно обновлены!' }) - } catch { - showToast({ type: 'error', message: 'Ой, что то пошло не так..' }) + } catch (error) { + showToast({ + type: 'error', + message: + error instanceof Error + ? error.message + : 'Ой, что то пошло не так..', + }) } } ) diff --git a/frontend/app/(urls)/publichnaya-oferta/page.tsx b/frontend/app/(urls)/publichnaya-oferta/page.tsx new file mode 100644 index 0000000..efb6c84 --- /dev/null +++ b/frontend/app/(urls)/publichnaya-oferta/page.tsx @@ -0,0 +1,324 @@ +import React from 'react' + +const PublicOffer = () => { + return ( +
+

Публичная оферта

+ +
+

1. ОБЩИЕ ПОЛОЖЕНИЯ

+
+

+ 1.1. Настоящий Публичный договор (далее – Оферта, договор) + представляет собой официальное предложение Интернет-сервиса + tripwb.com (далее — Компания) на оказание Информационных услуг + дееспособным физическим лицам (далее – Пользователь) по попутной + доставке посылок, либо совместной автомобильной поездке, через + вебсайт tripwb.com регулирует порядок использования Сайта и + взаимоотношения, возникающие при использовании Сайта и Сервисов + Пользователями. Компания не гарантирует доступность Сайта и Сервисов + круглосуточно. Компания имеет право в любой момент отказать любому + Пользователю, в использовании Сервисов при нарушении договора. +

+

+ 1.2. Принятие (акцепт) данной Оферты означает полное и + безоговорочное принятие Пользователем всех условий без каких-либо + исключений и/или ограничений и приравнивается в соответствии со + статьей 395 Гражданского Кодекса Республики Казахстан настоящее + Пользовательское соглашение признается офертой. Соглашение, + заключаемое в форме оферты, предусмотрено Гражданским Кодексом + Республики Казахстан, не требует двустороннего подписания и + действительно в электронном виде. +

+

+ 1.3. Данная Оферта считается заключенной (акцептированной) с момента + принятия Пользователем условий Сервиса путем заполнения учетной + записи на Сайте Компании. +

+

+ 1.4. Компания и Пользователь предоставляют взаимные гарантии своей + право и дееспособности, необходимые для заключения и исполнения + настоящей Оферты. +

+

+ 1.5. Пользователи не согласные с данной Офертой или с отдельными ее + пунктами, вправе отказаться от использования сайта + https://tripwb.com (далее — «Сайт»). +

+
+
+ +
+

2. Используемые Термины

+
+
+
+

«Компания»

+

tripwb.com

+
+
+

«Администрация Сайта»

+

+ уполномоченные сотрудники Компании, а также иные лица, + уполномоченные на управление Сайтом и предоставление Сервисов + Пользователям при использовании Сайта в соответствии с настоящим + Соглашением +

+
+
+

«Сайт»

+

+ Интернет-Сервис по попутной доставке посылок, а также совместных + автомобильных поездок, доступный на вебсайте tripwb.com +

+
+
+

«Аккаунт»

+

+ учетная запись, создание которой является обязательным условием + регистрации на Сайте для получения доступа к использованию + Сервисов Сайта +

+
+
+
+
+ +
+

3. Основные положения

+
+

+ 3.1. Компанией разработана платформа для оказания информационных + услуг по попутной доставке посылок и совместных автомобильных + поездках, доступная на вебсайте по адресу tripwb.com. Целью данной + платформы является предоставление Перевозчиками, следующим в + определенном направлении, возможности установления связи с + Отправителем, которым необходимо передать посылку, груз, либо + осуществить поездку в том же направлении, для уменьшения собственных + расходов. +

+

+ 3.2. Нажимая «Войти через Google» или через «Логин» и «Пароль». + Пользователь соглашается, принимает, и обязуется безоговорочно + следовать всем его условиям, также, Пользователь вправе отказаться + от использования Сайта tripwb.com. +

+

+ 3.3. Компания оставляет за собой право изменять условия Соглашения и + всех его неотъемлемых частей без согласования с Пользователем с + уведомлением последнего посредством размещения на Сайте новой + редакции Соглашения. +

+
+
+ +
+

Последнее обновление: 20.05.2025

+
+ +
+

Жария шарт (Оферта)

+ +
+

1. ЖАЛПЫ ЕРЕЖЕЛЕР

+
+

+ 1.1. Осы Жария шарт (бұдан әрі – Оферта, шарт) іс-әрекетке + қабілетті жеке тұлғаларға (бұдан әрі — Пайдаланушы) сәлемдемелерді + ілеспе жеткізу не бірлескен автомобиль сапары бойынша ақпараттық + қызметтер көрсетуге tripwb.com Интернет – сервистің (бұдан + әрі-Компания) ресми ұсынысын білдіреді, tripwb.com веб-сайт арқылы + Сайтты пайдалану тәртібін және Пайдаланушылар Сайтты және + Сервистерді пайдаланған кезде туындайтын қатынастарды реттейді. + Компания Сайт пен Сервистердің тәулік бойы қолжетімділігіне + кепілдік бермейді. Компания кез келген уақытта кез келген + Пайдаланушыға https://tripwb.com/ru/info_page/publichnaya-oferta/ + Шартты бұзған кезде Сервистерді пайдаланудан бас тартуға құқылы. +

+

+ 1.2. Осы Офертаны қабылдау (акцепт) Пайдаланушының қандай да бір + ерекшеліктерсіз және/немесе шектеулерсіз барлық шарттарды толық + және сөзсіз қабылдауын білдіреді және Қазақстан Республикасы + Азаматтық Кодексінің 395-бабына сәйкес теңестіріледі осы + Пайдаланушы келісімі оферта деп танылады. Оферта нысанында + жасалатын Келісім Қазақстан Республикасының Азаматтық кодексінде + көзделген, екіжақты қол қоюды талап етпейді және электрондық түрде + жарамды. +

+

+ 1.3. Бұл Оферта Пайдаланушы Компания Сайтындағы тіркеу жазбасын + толтыру арқылы Сервис шарттарын қабылдаған сәттен бастап жасалған + (акцептелген) болып есептеледі. +

+

+ 1.4. Компания мен Пайдаланушы осы Офертаны жасасу және орындау + үшін қажетті өз құқығы мен әрекет қабілеттілігіне өзара + кепілдіктер береді. +

+

+ 1.5. Осы Офертамен немесе оның жекелеген тармақтарымен келіспеген + пайдаланушылар https://tripwb.com (бұдан әрі - "Сайт") Сайтты + пайдаланудан бас тартуға құқылы. +

+
+
+ +
+

+ 2. Қолданылатын Терминдер +

+
+
+
+

«Компания»

+

tripwb.com

+
+
+

«Сайт Әкімшілігі»

+

+ Компанияның уәкілетті қызметкерлері, сондай-ақ осы Келісімге + сәйкес Сайтты пайдалану кезінде Пайдаланушыларға Сайтты + басқаруға және Сервистерді ұсынуға уәкілеттік берілген өзге де + тұлғалар, сондай-ақ Сайтқа барлық тиісті айрықша мүліктік + құқықтары, оның ішінде Сайттың домендік атауына және оны + әкімшілендіруді жүзеге асыратын құқығы бар тұлғалар. +

+
+
+

«Сайт»

+

+ Сәлемдемелерді, сондай-ақ tripwb.com вебсайтта қолжетімді + бірлескен автомобиль сапарларын ілеспе жеткізу жөніндегі + Интернет-Сервис. +

+
+
+

«Аккаунт»

+

+ тіркеу жазбасы, оны құру Сайттың Сервистерін пайдалануға қол + жеткізу үшін Сайтта тіркелудің міндетті шарты болып табылады. +

+
+
+
+
+ +
+

3. Негізгі ережелер

+
+

+ 3.1. Компания сәлемдемелерді ілеспе жеткізу және бірлескен + автомобиль сапарлары бойынша ақпараттық қызметтер көрсету үшін + tripwb.com вебсайтта қолжетімді платформа әзірледі. Бұл + платформаның мақсаты белгілі бір бағытта жүретін + Тасымалдаушылардың сілтемені, жүкті беруі немесе өз шығындарын + азайту үшін сол бағытта жүруді жүзеге асыруы қажет Жөнелтушімен + байланыс орнату мүмкіндігін ұсынуы болып табылады. +

+
+
+ +
+

+ 4. Пайдаланушыны тіркеу +

+
+

+ 4.1. Сайтты 18 жасқа толған жеке тұлғалар пайдалана алады. + Кәмелетке толмағандарға Сайтта тіркелуге қатаң тыйым салынады. + Платформаға қол жеткізе отырып, оның Сервистерін қолдана отырып + және Аккаунтты тіркей отырып, Пайдаланушылар кәмелетке толған және + толық қабілетті адамдар екендігін растайды және кепілдік береді. +

+
+
+ +
+

+ 5. Сайт Сервистері бойынша жалпы ережелер +

+
+

+ 5.1. Әкімшілік кез-келген Пайдаланушы Сайтта орналастырмас бұрын + кез-келген түрдегі контентті қарауға міндетті емес. +

+
+
+ +
+

+ 6. Сервистерді пайдалану +

+
+

+ 6.1. Хабарландыруларды жариялау. Төмендегі шарттар орындалған + жағдайда, Сіз Пайдаланушы ретінде Тасымалдаушы (Тасымалдау) және + Жөнелтуші (Тапсырыс) ретінде хабарландырулар жасай және жариялай + аласыз. +

+
+
+ +
+

+ 7. Дауларды қарау ережелері +

+
+

+ Осы дауларды қарау қағидалары (бұдан әрі - Қағидалар) "TWB" онлайн + – сервисін пайдалану туралы келісімнің (бұдан әрі - Келісім) + ажырамас бөлігі болып табылады және Пайдаланушылар арасындағы + дауларды шешу тәртібін белгілейді. +

+
+
+ +
+

+ 8. Хабарландыруларды жою себептері +

+
+

+ Пайдаланушының хабарландыруын Компания Пайдаланушының осы + Келісімнің талаптарын бұзуы себебінен, сондай-ақ мынадай себептер + бойынша жоюы мүмкін. +

+
+
+ +
+

+ 9. Компанияның жауапкершілігін шектеу +

+
+

+ Сайттың Сервистерін пайдалана отырып, Пайдаланушы Сайтты және оның + Сервистерді өз тәуекелімен және "сол қалпында" пайдаланатындығына + келісімін растайды. +

+
+
+ +
+

+ 10. Хабарламалар Сервисі +

+
+

+ Мәміле жасалғаннан кейін Пайдаланушыға Пайдаланушылар арасында + мәміле бойынша міндеттемелерді орындау үшін қажетті қосымша + ақпаратпен алмасуға мүмкіндік беретін хабар алмасу қызметіне қол + жетімділік беріледі. +

+
+
+ +
+

Соңғы жаңарту: 20.05.2025

+
+
+
+ ) +} + +export default PublicOffer diff --git a/frontend/app/api/account/main/route.ts b/frontend/app/api/account/main/route.ts index d8b4df4..a4370bd 100644 --- a/frontend/app/api/account/main/route.ts +++ b/frontend/app/api/account/main/route.ts @@ -1,5 +1,49 @@ import { NextRequest } from 'next/server' +import { getServerSession } from 'next-auth' +import { authOptions } from '@/app/api/auth/[...nextauth]/route' -export async function PUT(req: NextRequest) { - // обновляем данные в аккаунте +export async function PATCH(req: NextRequest) { + try { + const session = await getServerSession(authOptions) + + if (!session) { + return new Response(JSON.stringify({ error: 'Unauthorized' }), { + status: 401, + }) + } + + const data = await req.json() + const { firstName, lastName, email, phone_number, country, city } = data + + const response = await fetch( + `${process.env.NEXT_PUBLIC_API_URL}/account/change_main_data/`, + { + method: 'PATCH', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${session.accessToken}`, + }, + body: JSON.stringify({ + firstName, + lastName, + email, + phone_number, + country, + city, + }), + } + ) + + if (!response.ok) { + const error = await response.json() + return new Response(JSON.stringify(error), { status: response.status }) + } + + const result = await response.json() + return new Response(JSON.stringify(result), { status: 200 }) + } catch (error) { + return new Response(JSON.stringify({ error: 'Internal Server Error' }), { + status: 500, + }) + } } diff --git a/frontend/app/api/auth/[...nextauth]/route.ts b/frontend/app/api/auth/[...nextauth]/route.ts index 801f695..5910f53 100644 --- a/frontend/app/api/auth/[...nextauth]/route.ts +++ b/frontend/app/api/auth/[...nextauth]/route.ts @@ -42,7 +42,7 @@ interface GoogleToken extends JWT { error?: string } -const authOptions: NextAuthOptions = { +export const authOptions: NextAuthOptions = { providers: [ //google login flow // GoogleProvider({ diff --git a/frontend/components/Footer.tsx b/frontend/components/Footer.tsx index 22cf33f..8d2556c 100644 --- a/frontend/components/Footer.tsx +++ b/frontend/components/Footer.tsx @@ -31,7 +31,7 @@ const Footer = () => {
@@ -41,7 +41,7 @@ const Footer = () => { /> @@ -51,7 +51,7 @@ const Footer = () => { /> @@ -61,7 +61,7 @@ const Footer = () => { /> @@ -71,7 +71,7 @@ const Footer = () => { /> @@ -81,7 +81,7 @@ const Footer = () => { /> @@ -236,7 +236,7 @@ const Footer = () => {
Copyright © {new Date().getFullYear()}. Все права защищены.
- + Публичная оферта