Обновлены модели и компоненты для управления поставками и расходниками. Добавлены новые поля в модели SupplyOrder и соответствующие резолверы для поддержки логистики. Реализованы компоненты уведомлений для отображения статуса логистических заявок и поставок. Оптимизирован интерфейс для улучшения пользовательского опыта, добавлены логи для диагностики запросов. Обновлены GraphQL схемы и мутации для поддержки новых функциональных возможностей.

This commit is contained in:
Veronika Smirnova
2025-08-03 17:04:29 +03:00
parent a33adda9d7
commit 8407ca397c
34 changed files with 5382 additions and 1795 deletions

View File

@ -1,84 +1,82 @@
import { ApolloServer } from '@apollo/server'
import { startServerAndCreateNextHandler } from '@as-integrations/next'
import { NextRequest } from 'next/server'
import jwt from 'jsonwebtoken'
import { typeDefs } from '@/graphql/typedefs'
import { resolvers } from '@/graphql/resolvers'
// Интерфейс для контекста
interface Context {
user?: {
id: string
phone: string
}
admin?: {
id: string
username: string
}
}
import { ApolloServer } from "@apollo/server";
import { startServerAndCreateNextHandler } from "@as-integrations/next";
import { NextRequest } from "next/server";
import jwt from "jsonwebtoken";
import { typeDefs } from "@/graphql/typedefs";
import { resolvers } from "@/graphql/resolvers";
import { Context } from "@/graphql/context";
// Создаем Apollo Server
const server = new ApolloServer<Context>({
typeDefs,
resolvers,
})
});
// Создаем Next.js handler
const handler = startServerAndCreateNextHandler<NextRequest>(server, {
context: async (req: NextRequest) => {
// Извлекаем токен из заголовка Authorization
const authHeader = req.headers.get('authorization')
const token = authHeader?.replace('Bearer ', '')
const authHeader = req.headers.get("authorization");
const token = authHeader?.replace("Bearer ", "");
console.log('GraphQL Context - Auth header:', authHeader)
console.log('GraphQL Context - Token:', token ? `${token.substring(0, 20)}...` : 'No token')
console.log("GraphQL Context - Auth header:", authHeader);
console.log(
"GraphQL Context - Token:",
token ? `${token.substring(0, 20)}...` : "No token"
);
if (!token) {
console.log('GraphQL Context - No token provided')
return { user: undefined, admin: undefined }
console.log("GraphQL Context - No token provided");
return { user: undefined, admin: undefined };
}
try {
// Верифицируем JWT токен
const decoded = jwt.verify(token, process.env.JWT_SECRET!) as {
userId?: string
phone?: string
adminId?: string
username?: string
type?: string
}
userId?: string;
phone?: string;
adminId?: string;
username?: string;
type?: string;
};
// Проверяем тип токена
if (decoded.type === 'admin' && decoded.adminId && decoded.username) {
console.log('GraphQL Context - Decoded admin:', { id: decoded.adminId, username: decoded.username })
if (decoded.type === "admin" && decoded.adminId && decoded.username) {
console.log("GraphQL Context - Decoded admin:", {
id: decoded.adminId,
username: decoded.username,
});
return {
admin: {
id: decoded.adminId,
username: decoded.username
}
}
username: decoded.username,
},
};
} else if (decoded.userId && decoded.phone) {
console.log('GraphQL Context - Decoded user:', { id: decoded.userId, phone: decoded.phone })
console.log("GraphQL Context - Decoded user:", {
id: decoded.userId,
phone: decoded.phone,
});
return {
user: {
id: decoded.userId,
phone: decoded.phone
}
}
phone: decoded.phone,
},
};
}
return { user: undefined, admin: undefined }
return { user: undefined, admin: undefined };
} catch (error) {
console.error('GraphQL Context - Invalid token:', error)
return { user: undefined, admin: undefined }
console.error("GraphQL Context - Invalid token:", error);
return { user: undefined, admin: undefined };
}
}
})
},
});
export async function GET(request: NextRequest) {
return handler(request)
return handler(request);
}
export async function POST(request: NextRequest) {
return handler(request)
}
return handler(request);
}