Добавлен новый компонент для компактного выбора кампаний в AdvertisingTab, обновлены интерфейсы для типизации данных API. Реализован GraphQL запрос для получения списка кампаний Wildberries. Оптимизирована логика отображения статистики кампаний и добавлены новые поля для обработки данных. Обновлены резолверы и типы для поддержки новых данных.
This commit is contained in:
@ -712,7 +712,10 @@ export const GET_WILDBERRIES_CAMPAIGN_STATS = gql`
|
||||
cr
|
||||
shks
|
||||
sum_price
|
||||
dates
|
||||
interval {
|
||||
begin
|
||||
end
|
||||
}
|
||||
days {
|
||||
date
|
||||
views
|
||||
@ -725,25 +728,65 @@ export const GET_WILDBERRIES_CAMPAIGN_STATS = gql`
|
||||
cr
|
||||
shks
|
||||
sum_price
|
||||
apps {
|
||||
views
|
||||
clicks
|
||||
ctr
|
||||
cpc
|
||||
sum
|
||||
atbs
|
||||
orders
|
||||
cr
|
||||
shks
|
||||
sum_price
|
||||
appType
|
||||
nm {
|
||||
views
|
||||
clicks
|
||||
ctr
|
||||
cpc
|
||||
sum
|
||||
atbs
|
||||
orders
|
||||
cr
|
||||
shks
|
||||
sum_price
|
||||
name
|
||||
nmId
|
||||
}
|
||||
}
|
||||
}
|
||||
boosterStats {
|
||||
date
|
||||
views
|
||||
clicks
|
||||
ctr
|
||||
cpc
|
||||
sum
|
||||
atbs
|
||||
orders
|
||||
cr
|
||||
shks
|
||||
sum_price
|
||||
nm
|
||||
avg_position
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
export const GET_WILDBERRIES_CAMPAIGNS_LIST = gql`
|
||||
query GetWildberriesCampaignsList {
|
||||
getWildberriesCampaignsList {
|
||||
success
|
||||
message
|
||||
data {
|
||||
adverts {
|
||||
type
|
||||
status
|
||||
count
|
||||
advert_list {
|
||||
advertId
|
||||
changeTime
|
||||
}
|
||||
}
|
||||
all
|
||||
}
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
// Админ запросы
|
||||
export const ADMIN_ME = gql`
|
||||
query AdminMe {
|
||||
|
@ -5836,6 +5836,73 @@ const wildberriesQueries = {
|
||||
};
|
||||
}
|
||||
},
|
||||
|
||||
getWildberriesCampaignsList: async (
|
||||
_: unknown,
|
||||
__: unknown,
|
||||
context: Context
|
||||
) => {
|
||||
if (!context.user) {
|
||||
throw new GraphQLError("Требуется авторизация", {
|
||||
extensions: { code: "UNAUTHENTICATED" },
|
||||
});
|
||||
}
|
||||
|
||||
try {
|
||||
// Получаем организацию пользователя и её WB API ключ
|
||||
const user = await prisma.user.findUnique({
|
||||
where: { id: context.user.id },
|
||||
include: {
|
||||
organization: {
|
||||
include: {
|
||||
apiKeys: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
if (!user?.organization) {
|
||||
throw new GraphQLError("Организация не найдена");
|
||||
}
|
||||
|
||||
if (user.organization.type !== "SELLER") {
|
||||
throw new GraphQLError("Доступно только для продавцов");
|
||||
}
|
||||
|
||||
const wbApiKeyRecord = user.organization.apiKeys?.find(
|
||||
(key) => key.marketplace === "WILDBERRIES" && key.isActive
|
||||
);
|
||||
|
||||
if (!wbApiKeyRecord) {
|
||||
throw new GraphQLError("WB API ключ не настроен");
|
||||
}
|
||||
|
||||
// Создаем экземпляр сервиса
|
||||
const wbService = new WildberriesService(wbApiKeyRecord.apiKey);
|
||||
|
||||
// Получаем список кампаний
|
||||
const campaignsList = await wbService.getCampaignsList();
|
||||
|
||||
return {
|
||||
success: true,
|
||||
data: campaignsList,
|
||||
message: null,
|
||||
};
|
||||
} catch (error) {
|
||||
console.error("Error fetching WB campaigns list:", error);
|
||||
return {
|
||||
success: false,
|
||||
message:
|
||||
error instanceof Error
|
||||
? error.message
|
||||
: "Ошибка получения списка кампаний",
|
||||
data: {
|
||||
adverts: [],
|
||||
all: 0,
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
// Добавляем админ запросы и мутации к основным резолверам
|
||||
|
@ -102,6 +102,9 @@ export const typeDefs = gql`
|
||||
getWildberriesCampaignStats(
|
||||
input: WildberriesCampaignStatsInput!
|
||||
): WildberriesCampaignStatsResponse!
|
||||
|
||||
# Список кампаний Wildberries
|
||||
getWildberriesCampaignsList: WildberriesCampaignsListResponse!
|
||||
}
|
||||
|
||||
type Mutation {
|
||||
@ -1057,9 +1060,14 @@ export const typeDefs = gql`
|
||||
cr: Float!
|
||||
shks: Int!
|
||||
sum_price: Float!
|
||||
dates: [String!]!
|
||||
interval: WildberriesCampaignInterval
|
||||
days: [WildberriesCampaignDayStats!]!
|
||||
boosterStats: [WildberriesCampaignDayStats!]!
|
||||
boosterStats: [WildberriesBoosterStats!]!
|
||||
}
|
||||
|
||||
type WildberriesCampaignInterval {
|
||||
begin: String!
|
||||
end: String!
|
||||
}
|
||||
|
||||
type WildberriesCampaignDayStats {
|
||||
@ -1074,5 +1082,66 @@ export const typeDefs = gql`
|
||||
cr: Float!
|
||||
shks: Int!
|
||||
sum_price: Float!
|
||||
apps: [WildberriesAppStats!]
|
||||
}
|
||||
|
||||
type WildberriesAppStats {
|
||||
views: Int!
|
||||
clicks: Int!
|
||||
ctr: Float!
|
||||
cpc: Float!
|
||||
sum: Float!
|
||||
atbs: Int!
|
||||
orders: Int!
|
||||
cr: Float!
|
||||
shks: Int!
|
||||
sum_price: Float!
|
||||
appType: Int!
|
||||
nm: [WildberriesProductStats!]
|
||||
}
|
||||
|
||||
type WildberriesProductStats {
|
||||
views: Int!
|
||||
clicks: Int!
|
||||
ctr: Float!
|
||||
cpc: Float!
|
||||
sum: Float!
|
||||
atbs: Int!
|
||||
orders: Int!
|
||||
cr: Float!
|
||||
shks: Int!
|
||||
sum_price: Float!
|
||||
name: String!
|
||||
nmId: Int!
|
||||
}
|
||||
|
||||
type WildberriesBoosterStats {
|
||||
date: String!
|
||||
nm: Int!
|
||||
avg_position: Float!
|
||||
}
|
||||
|
||||
# Типы для списка кампаний
|
||||
type WildberriesCampaignsListResponse {
|
||||
success: Boolean!
|
||||
message: String
|
||||
data: WildberriesCampaignsData!
|
||||
}
|
||||
|
||||
type WildberriesCampaignsData {
|
||||
adverts: [WildberriesCampaignGroup!]!
|
||||
all: Int!
|
||||
}
|
||||
|
||||
type WildberriesCampaignGroup {
|
||||
type: Int!
|
||||
status: Int!
|
||||
count: Int!
|
||||
advert_list: [WildberriesCampaignItem!]!
|
||||
}
|
||||
|
||||
type WildberriesCampaignItem {
|
||||
advertId: Int!
|
||||
changeTime: String!
|
||||
}
|
||||
`;
|
||||
|
Reference in New Issue
Block a user