From 647163aa88c5d88c4b8fb85bda45027a00c0bfa9 Mon Sep 17 00:00:00 2001 From: ITQ Date: Wed, 19 Feb 2025 14:34:51 +0300 Subject: [PATCH] feat: added ads endpoints --- .../services/backend/api/v1/ads/__init__.py | 0 .../services/backend/api/v1/ads/schemas.py | 23 ++++++++ solution/services/backend/api/v1/ads/views.py | 55 +++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 solution/services/backend/api/v1/ads/__init__.py create mode 100644 solution/services/backend/api/v1/ads/schemas.py create mode 100644 solution/services/backend/api/v1/ads/views.py diff --git a/solution/services/backend/api/v1/ads/__init__.py b/solution/services/backend/api/v1/ads/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/solution/services/backend/api/v1/ads/schemas.py b/solution/services/backend/api/v1/ads/schemas.py new file mode 100644 index 0000000..c201001 --- /dev/null +++ b/solution/services/backend/api/v1/ads/schemas.py @@ -0,0 +1,23 @@ +from typing import ClassVar +from uuid import UUID + +from ninja import ModelSchema, Schema + +from apps.campaign.models import Campaign + + +class Advertisment(ModelSchema): + advertiser_id: UUID + ad_id: UUID + + class Meta: + model = Campaign + fields: ClassVar[tuple[str]] = ( + Campaign.ad_title.field.name, + Campaign.ad_text.field.name, + Campaign.ad_image.field.name, + ) + + +class ClickIn(Schema): + client_id: UUID diff --git a/solution/services/backend/api/v1/ads/views.py b/solution/services/backend/api/v1/ads/views.py new file mode 100644 index 0000000..163c019 --- /dev/null +++ b/solution/services/backend/api/v1/ads/views.py @@ -0,0 +1,55 @@ +from http import HTTPStatus as status +from uuid import UUID + +from django.http import HttpRequest +from django.shortcuts import get_object_or_404 +from ninja import Router + +from api.v1 import schemas as global_schemas +from api.v1.ads import schemas +from apps.campaign.models import Campaign +from apps.client.models import Client + +router = Router(tags=["ads"]) + + +@router.get( + "", + response={ + status.OK: schemas.Advertisment, + status.BAD_REQUEST: global_schemas.BadRequestError, + status.NOT_FOUND: global_schemas.NotFoundError, + }, +) +def get_advertisment( + request: HttpRequest, client_id: UUID +) -> tuple[status, Campaign]: + client = get_object_or_404(Client, id=client_id) + + campaign = Campaign.suggest(client) + + campaign.view(client) + + return status.OK, campaign + + +@router.post( + "/{advertisment_id}/click", + response={ + status.NO_CONTENT: None, + status.BAD_REQUEST: global_schemas.BadRequestError, + status.FORBIDDEN: global_schemas.ForbiddenError, + status.NOT_FOUND: global_schemas.NotFoundError, + }, +) +def click_on_advertisment( + request: HttpRequest, advertisment_id: UUID, client: schemas.ClickIn +) -> tuple[status, None]: + campaign_instance: Campaign = get_object_or_404( + Campaign, id=advertisment_id + ) + client_instance: Client = get_object_or_404(Client, id=client.client_id) + + campaign_instance.click(client_instance) + + return status.NO_CONTENT, None