Skip to content

Commit

Permalink
feat: change project
Browse files Browse the repository at this point in the history
  • Loading branch information
Lokrip committed Feb 12, 2025
1 parent d8c2a61 commit a5c779b
Show file tree
Hide file tree
Showing 16 changed files with 128 additions and 28 deletions.
7 changes: 6 additions & 1 deletion server/exeption.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
# Ошибки, связанные с отсутствием данных
# Ошибки, с данными
DATA_NOT_FOUND = "Data not available" # Данные недоступны
RESOURCE_NOT_FOUND = "Requested resource was not found" # Запрашиваемый ресурс не найден
CREATION_FAILED = "Failed to create resource" # Не удалось создать ресурс
UPDATE_FAILED = "Failed to update resource" # Не удалось обновить ресурс
RESOURCE_NOT_UPDATABLE = "Resource cannot be updated" # Ресурс не подлежит обновлению
DELETION_FAILED = "Failed to delete resource" # Не удалось удалить ресурс
RESOURCE_NOT_DELETABLE = "Resource cannot be deleted" # Ресурс не подлежит удалению

# Ошибки валидации данных
INVALID_INPUT = "Invalid input provided" # Введены неверные данные
Expand Down
4 changes: 0 additions & 4 deletions server/models/role.py

This file was deleted.

10 changes: 7 additions & 3 deletions server/models/shop.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import uuid

from django.db import models
from django.conf import settings
from django.utils.translation import gettext_lazy as _
Expand Down Expand Up @@ -127,9 +129,11 @@ class Product(DateCreatedModel, DateUpdatedModel, ModelTitle):



# def save(self, *args, **kwargs):
# if not self.slug:
# self.slug = f"{slugify(self.title)}-{}"
def save(self, *args, **kwargs):
if not self.slug:
self.slug = f"{slugify(self.title)}-{self.pk}-{uuid.uuid4()}"

return super().save(*args, **kwargs)


class Meta:
Expand Down
Empty file added server/permissions/__init__.py
Empty file.
Empty file.
21 changes: 21 additions & 0 deletions server/serializers/product_serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,27 @@

from .category_serializers import CategorySerializer


class ProductCreateSerializer(serializers.ModelSerializer):
user = serializers.HiddenField(default=serializers.CurrentUserDefault())



class Meta:
model = Product
fields = (
'title', 'metaTitle', 'summary',
'accessibility', 'condition', 'warehouse',
'promotional', 'checks', 'price', 'discount',
'category', 'user'
)

def validate(self, attrs):
request = self.context.get("request")
if not request or not request.user.is_authenticated:
raise serializers.ValidationError("User is not authenticated")
return super().validate(attrs)

class ProductDetailSerializer(serializers.ModelSerializer):
category = CategorySerializer(read_only=True)

Expand Down
3 changes: 3 additions & 0 deletions server/service/product_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
from server.pagination import ProductResultsSetPagination
from server.serializers.product_serializers import ProductListSerializer

def validate_product(**kwargs):
pass

def get_product_list(**kwargs):
request = kwargs.get("request", None)
view = kwargs.get("view")
Expand Down
Empty file added server/signals.py
Empty file.
8 changes: 8 additions & 0 deletions server/validators.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from django.core.exceptions import ValidationError
from django.core.validators import BaseValidator


class FieldValidator(BaseValidator):
def __init__(self, min_length=None, max_length=None, regex=None, message=None, code=None):
self.min_length = min_length
self.max_length = max_length
45 changes: 43 additions & 2 deletions server/views/product_view.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,27 @@
from rest_framework.viewsets import ViewSet
from rest_framework.response import Response
from rest_framework.permissions import (
IsAuthenticatedOrReadOnly,
IsAuthenticated
)
from rest_framework import status

from server.serializers.product_serializers import (
ProductDetailSerializer
ProductDetailSerializer,
ProductCreateSerializer
)
from server.service.product_service import get_product_list
from server.models import Product
from server.exeption import (
DATA_NOT_FOUND,
RESOURCE_NOT_FOUND
RESOURCE_NOT_FOUND,
CREATION_FAILED
)


class ProductViewSet(ViewSet):
lookup_field = "slug"
permission_classes = [IsAuthenticated]

def list(self, request):
(serializer, paginator) = get_product_list(
Expand Down Expand Up @@ -42,3 +49,37 @@ def retrieve(self, request, *args, **kwargs):

serializer = ProductDetailSerializer(product)
return Response(serializer.data, status=status.HTTP_200_OK,)

def create(self, request):
data = request.data or None
if(data is None):
return Response(
{"message": CREATION_FAILED},
status=status.HTTP_404_NOT_FOUND
)
serializer = ProductCreateSerializer(data=data, context={"request": request})
serializer.is_valid(raise_exception=True)
self.perform_create(serializer=serializer)
headers = self.get_success_headers(
f'/api/v1/products/{request.data.get("id")
if (request.data.get("id", None) is not None)
else ""
}'
)
return ResourceWarning(
serializer.data,
status=status.HTTP_201_CREATED,
headers={
**headers,
"Content-type": "application/json"
}
)

def perform_create(self, serializer):
serializer.save()

def get_success_headers(self, location):
try:
return {'Location': str(location)}
except (TypeError, KeyError):
return {}
7 changes: 7 additions & 0 deletions src/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,13 @@ import { NextAuthOptions } from "next-auth";
import { AuthenticatedFields, JWTUser } from "./types/app/auth.types";
import pages from "./service/route";


async function refreshAccessToken(token) {
try {

}
}

export const authOptions: NextAuthOptions = {
providers: [
CredentialsProvider({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,16 @@ const NavigationBar: FC = () => {
{id: 3, navigation: "/account/login", type: "sign-in", titleNavigation: "Войти", icon: "User"},
])

// const session = useSession()
const session = useSession()

// useEffect(() => {
// if(session.status == "authenticated") {
// setNavigation(prev => {
// const updatedNavigations = prev.filter(navigation => navigation.type !== "sign-in")
// return [...updatedNavigations]
// })
// }
// }, [session])
useEffect(() => {
if(session.status == "authenticated") {
setNavigation(prev => {
const updatedNavigations = prev.filter(navigation => navigation.type !== "sign-in")
return [...updatedNavigations]
})
}
}, [session])

return (
<List
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,26 @@ import ProductList from './ProductList/ProductList';
import { getProductsData } from '@/core/api/product.api';
import { ProductError } from '@/types/app/enum/product.enum';
import { HeadingH } from '@/components/plagins/H.number';
import { getServerSession } from 'next-auth';
import { JWTUser } from '@/types/app/auth.types';
import { authOptions } from '@/auth';

interface ContentWrapperProps {
param?: any;
}

const ContentWrapper: FC<ContentWrapperProps> = async ({param}) => {
const session = await getServerSession(authOptions);
const accessToken = (session?.user as JWTUser).accessToken
const searchQuery = param.q ?? param.searchQuery;
const currentPage = Number(param?.page) || 1;

try {
const {results: products, count: totalProductCount} = await getProductsData<IPaginationProduct>(
searchQuery,
{isPagination: true,
currentPage: currentPage}
currentPage: currentPage},
accessToken
)

return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { useActions } from '@/hooks';
import { RootState } from '@/redux/store';
import { selectedProducts } from '@/redux/selectors/product';
import PCard from '@/components/ui/elements/card/PrimaryCard/PrimaryCard';
import { useSession } from 'next-auth/react';

interface ProductListProps {
searchQuery: string;
Expand Down Expand Up @@ -41,6 +42,7 @@ const ProductList: FC<ProductListProps> = ({
const productCurrentPageSelector = (state: RootState) => state.productReduser.currentPage
const productFetchingSelector = (state: RootState) => state.productReduser.isFetching


return (
<>
<PaginationInfiniteScrolling<
Expand Down
8 changes: 6 additions & 2 deletions src/core/api/product.api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { axios } from "@/service/axios";
async function getProductsData<T>(search: ProductFunApiSearchAttributes, {
isPagination = false,
currentPage = null
}: ProductFunApiPaginationAttributes = {}): Promise<T> {
}: ProductFunApiPaginationAttributes = {}, authToken: string): Promise<T> {
"use server"

try {
Expand All @@ -23,7 +23,11 @@ async function getProductsData<T>(search: ProductFunApiSearchAttributes, {
if (params.length > 0)
url += `?${params.join("&")}`;

const data = await axios.get<T>(url);
const headers = {
"Authorization": `Bearer ${authToken}`
}
console.log(headers)
const data = await axios.get<T>(url, headers);
return data;
} catch(error) {
console.error(error)
Expand Down
15 changes: 9 additions & 6 deletions src/core/providers/Providers.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,21 @@ import { PropsWithChildren } from "react";
import { Provider } from 'react-redux'
import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
import { setupStore } from "../../redux/store";
import { SessionProvider } from "next-auth/react";

const queryClient = new QueryClient();
const store = setupStore();

export default function Providers<
P extends PropsWithChildren>({ children }: P) {
return (
<Provider store={store}>
<QueryClientProvider client={queryClient}>
{children}
<ReactQueryDevtools initialIsOpen={false} />
</QueryClientProvider>
</Provider>
<SessionProvider>
<Provider store={store}>
<QueryClientProvider client={queryClient}>
{children}
<ReactQueryDevtools initialIsOpen={false} />
</QueryClientProvider>
</Provider>
</SessionProvider>
);
}

0 comments on commit a5c779b

Please sign in to comment.