improvement for the backend api

This commit is contained in:
ivannoskov
2025-11-19 12:56:04 +03:00
parent b0a9934220
commit d4672ea32b
40 changed files with 2383 additions and 3313 deletions

View File

@@ -60,11 +60,11 @@ export default function CreatePurchasePage() {
target_channel_id: "",
external_channel_id: "",
creative_id: "",
scheduled_date: "",
placement_date: "",
cost: "",
comment: "",
post_link: "",
invite_link_type: "public" as "public" | "private",
invite_link_type: "public" as "public" | "approval",
});
useEffect(() => {
@@ -73,15 +73,24 @@ export default function CreatePurchasePage() {
const loadData = async () => {
try {
const [channelsRes, externalChannelsRes, creativesRes] =
await Promise.all([
channelsApi.list({ is_active: true }),
externalChannelsApi.list(),
const channelsRes = await channelsApi.list();
setChannels(channelsRes.target_channels.filter((c) => c.is_active));
// Загружаем внешние каналы для первого доступного target channel
if (channelsRes.target_channels.length > 0) {
const firstTargetChannel = channelsRes.target_channels[0];
const [externalChannelsRes, creativesRes] = await Promise.all([
externalChannelsApi.list(firstTargetChannel.id),
creativesApi.list(),
]);
setChannels(channelsRes.data);
setExternalChannels(externalChannelsRes.data);
setCreatives(creativesRes.data.filter((c) => !c.is_archived));
setExternalChannels(externalChannelsRes.external_channels);
setCreatives(
creativesRes.creatives.filter((c) => c.status === "active")
);
} else {
setCreatives([]);
setExternalChannels([]);
}
} catch (err) {
console.error("Error loading data:", err);
}
@@ -116,7 +125,7 @@ export default function CreatePurchasePage() {
return;
}
if (!formData.scheduled_date) {
if (!formData.placement_date) {
setError("Укажите дату размещения");
return;
}
@@ -132,10 +141,10 @@ export default function CreatePurchasePage() {
target_channel_id: formData.target_channel_id,
external_channel_id: formData.external_channel_id,
creative_id: formData.creative_id,
scheduled_date: formData.scheduled_date,
placement_date: formData.placement_date,
cost: parseFloat(formData.cost),
comment: formData.comment || undefined,
post_link: formData.post_link || undefined,
ad_post_url: formData.post_link || undefined,
invite_link_type: formData.invite_link_type,
});
@@ -247,7 +256,7 @@ export default function CreatePurchasePage() {
target_channel_id: "",
external_channel_id: "",
creative_id: "",
scheduled_date: "",
placement_date: "",
cost: "",
comment: "",
post_link: "",
@@ -394,15 +403,15 @@ export default function CreatePurchasePage() {
<CardContent className="space-y-4">
<div className="grid gap-4 md:grid-cols-2">
<div className="space-y-2">
<Label htmlFor="scheduled_date">Дата размещения *</Label>
<Label htmlFor="placement_date">Дата размещения *</Label>
<Input
id="scheduled_date"
type="date"
value={formData.scheduled_date}
id="placement_date"
type="datetime-local"
value={formData.placement_date}
onChange={(e) =>
setFormData({
...formData,
scheduled_date: e.target.value,
placement_date: e.target.value,
})
}
/>
@@ -443,7 +452,7 @@ export default function CreatePurchasePage() {
<Label>Тип пригласительной ссылки *</Label>
<RadioGroup
value={formData.invite_link_type}
onValueChange={(value: "public" | "private") =>
onValueChange={(value: "public" | "approval") =>
setFormData({ ...formData, invite_link_type: value })
}
>
@@ -454,8 +463,8 @@ export default function CreatePurchasePage() {
</Label>
</div>
<div className="flex items-center space-x-2">
<RadioGroupItem value="private" id="private" />
<Label htmlFor="private" className="font-normal">
<RadioGroupItem value="approval" id="approval" />
<Label htmlFor="approval" className="font-normal">
С одобрением (запрос на вступление через бота)
</Label>
</div>