change user membership without payment
This commit is contained in:
@@ -170,13 +170,15 @@ class ChangeUserMembership(ViewSet):
|
|||||||
@handle_exceptions
|
@handle_exceptions
|
||||||
def change_plan(self, request):
|
def change_plan(self, request):
|
||||||
"""Меняем пользователю тарифный план"""
|
"""Меняем пользователю тарифный план"""
|
||||||
user_profile = get_object_or_404(User, id=request.user.id)
|
user = request.user
|
||||||
|
user_profile = get_object_or_404(UserProfile, user=user)
|
||||||
|
|
||||||
serializer = PlanChangeSerializer(user_profile, data=request.data)
|
serializer = PlanChangeSerializer(user_profile, data=request.data)
|
||||||
|
|
||||||
if serializer.is_valid():
|
if serializer.is_valid():
|
||||||
serializer.save()
|
serializer.save()
|
||||||
return Response({"message": "Тариф успешно изменен"}, status=status.HTTP_200_OK)
|
return Response({"message": "Тариф успешно изменен"}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
class GetMembershipData(ViewSet):
|
class GetMembershipData(ViewSet):
|
||||||
|
|||||||
@@ -13,7 +13,8 @@ UserDataView,
|
|||||||
AccountActionsView,
|
AccountActionsView,
|
||||||
CityView,
|
CityView,
|
||||||
CountryView,
|
CountryView,
|
||||||
GetMembershipData)
|
GetMembershipData,
|
||||||
|
ChangeUserMembership)
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path("v1/faq/", FAQView.as_view(), name='faqMain'),
|
path("v1/faq/", FAQView.as_view(), name='faqMain'),
|
||||||
@@ -36,4 +37,5 @@ urlpatterns = [
|
|||||||
path("v1/countries/", CountryView.as_view({'get':'get_countries'}), name='get_countries'),
|
path("v1/countries/", CountryView.as_view({'get':'get_countries'}), name='get_countries'),
|
||||||
|
|
||||||
path("v1/plans/", GetMembershipData.as_view({'get':'get_pricing_data'}), name='get_pricing_data'),
|
path("v1/plans/", GetMembershipData.as_view({'get':'get_pricing_data'}), name='get_pricing_data'),
|
||||||
|
path("v1/account/change_membership/", ChangeUserMembership.as_view({'patch':'change_plan'}), name='change_plan'),
|
||||||
]
|
]
|
||||||
@@ -18,8 +18,24 @@ const PricingCard: React.FC<PricingCardProps> = ({
|
|||||||
const handlePlanChange = async () => {
|
const handlePlanChange = async () => {
|
||||||
try {
|
try {
|
||||||
setIsLoading(true)
|
setIsLoading(true)
|
||||||
console.log('Changing plan to:', plan)
|
|
||||||
// const response = await changePlan(plan) -- тут обработка данных запроса на смену плана
|
const requestData = {
|
||||||
|
plan: plan,
|
||||||
|
}
|
||||||
|
|
||||||
|
const response = await fetch('/api/account/membership', {
|
||||||
|
method: 'PATCH',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify(requestData),
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
const error = await response.json()
|
||||||
|
console.error('PricingCard - Server error:', error)
|
||||||
|
throw new Error(error.error || 'Ошибка при создании маршрута')
|
||||||
|
}
|
||||||
|
|
||||||
// обновляем данные в сторе
|
// обновляем данные в сторе
|
||||||
if (user) {
|
if (user) {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ const AdminPayments = () => {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const fetchPlans = async () => {
|
const fetchPlans = async () => {
|
||||||
try {
|
try {
|
||||||
const response = await fetch('/api/account/get-plans')
|
const response = await fetch('/api/account/membership')
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error('Failed to fetch plans')
|
throw new Error('Failed to fetch plans')
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
import { NextRequest } from 'next/server'
|
|
||||||
|
|
||||||
export async function GET(req: NextRequest) {
|
|
||||||
try {
|
|
||||||
const response = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/plans/`, {
|
|
||||||
method: 'GET',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!response.ok) {
|
|
||||||
const error = await response.json()
|
|
||||||
console.error('API error:', error)
|
|
||||||
return new Response(JSON.stringify(error), { status: response.status })
|
|
||||||
}
|
|
||||||
|
|
||||||
const result = await response.json()
|
|
||||||
return new Response(JSON.stringify(result), { status: 200 })
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Route handler error:', error)
|
|
||||||
return new Response(JSON.stringify({ error: 'Internal Server Error' }), {
|
|
||||||
status: 500,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
69
frontend/app/api/account/membership/route.ts
Normal file
69
frontend/app/api/account/membership/route.ts
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
import { NextRequest } from 'next/server'
|
||||||
|
import { getServerSession } from 'next-auth'
|
||||||
|
import { authOptions } from '@/app/api/auth/[...nextauth]/route'
|
||||||
|
|
||||||
|
export async function GET(req: NextRequest) {
|
||||||
|
try {
|
||||||
|
const response = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/plans/`, {
|
||||||
|
method: 'GET',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
const error = await response.json()
|
||||||
|
console.error('API error:', error)
|
||||||
|
return new Response(JSON.stringify(error), { status: response.status })
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await response.json()
|
||||||
|
return new Response(JSON.stringify(result), { status: 200 })
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Route handler error:', error)
|
||||||
|
return new Response(JSON.stringify({ error: 'Internal Server Error' }), {
|
||||||
|
status: 500,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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 requestBody = {
|
||||||
|
account_type: data.plan,
|
||||||
|
}
|
||||||
|
|
||||||
|
const response = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/account/change_membership/`, {
|
||||||
|
method: 'PATCH',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
Authorization: `Bearer ${session.accessToken}`,
|
||||||
|
},
|
||||||
|
body: JSON.stringify(requestBody),
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
const error = await response.json()
|
||||||
|
console.error('API Route - Backend error:', error)
|
||||||
|
return new Response(JSON.stringify(error), { status: response.status })
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await response.json()
|
||||||
|
return new Response(JSON.stringify(result), { status: 200 })
|
||||||
|
} catch (error) {
|
||||||
|
console.error('API Route - Error:', error)
|
||||||
|
return new Response(JSON.stringify({ error: 'Internal Server Error' }), {
|
||||||
|
status: 500,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user