From d4eaf4f3881ec2456076a6e152adc889965bff0a Mon Sep 17 00:00:00 2001 From: DmsAnhr Date: Wed, 28 Jan 2026 12:45:19 +0700 Subject: [PATCH] add microservice service --- app/api/dependencies/auth.py | 8 ++++++- app/api/v1/routes/mapset_route.py | 12 ++++++++++- app/core/config.py | 4 ++++ app/services/mapset_service.py | 35 ++++++++++++++++++++++++++++++- 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/app/api/dependencies/auth.py b/app/api/dependencies/auth.py index 827c614..ece3f5a 100644 --- a/app/api/dependencies/auth.py +++ b/app/api/dependencies/auth.py @@ -1,7 +1,7 @@ from datetime import datetime from typing import Optional -from fastapi import Depends, HTTPException, Request, status +from fastapi import Depends, HTTPException, Request, status, Header from fastapi.security import OAuth2PasswordBearer from fastapi.security.utils import get_authorization_scheme_param from jose import JWTError @@ -98,3 +98,9 @@ async def get_current_active_admin(current_user: UserSchema = Depends(get_curren ) return current_user + +async def verify_internal_service( + x_service_key: str = Header(...) +): + if x_service_key != settings.SERVICE_KEY: + raise HTTPException(status_code=403, detail="Forbidden") diff --git a/app/api/v1/routes/mapset_route.py b/app/api/v1/routes/mapset_route.py index 9007188..697d884 100644 --- a/app/api/v1/routes/mapset_route.py +++ b/app/api/v1/routes/mapset_route.py @@ -2,7 +2,7 @@ from typing import List from fastapi import APIRouter, Body, Depends, status -from app.api.dependencies.auth import get_current_active_user, get_payload +from app.api.dependencies.auth import get_current_active_user, get_payload, verify_internal_service from app.api.dependencies.factory import Factory from app.core.data_types import UUID7Field from app.core.params import CommonParams @@ -83,6 +83,16 @@ async def create_mapset( mapset = await service.create(user, data.dict()) return mapset +@router.post("/internal/mapsets", response_model=MapsetSchema) +async def create_mapset_internal( + data: MapsetCreateSchema, + _: None = Depends(verify_internal_service), + mapset_service: MapsetService = Depends(Factory().get_mapset_service), +): + return await mapset_service.create_system(None, data.dict()) + + + @router.post("/mapsets/color_scale", status_code=status.HTTP_200_OK) async def create_color_scale( diff --git a/app/core/config.py b/app/core/config.py index 5af032a..9b40d23 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -1,3 +1,4 @@ +import os from functools import lru_cache from typing import List, Optional @@ -80,6 +81,9 @@ class Settings(BaseSettings): model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", case_sensitive=True, extra="allow") + # Microservice Key + SERVICE_KEY : str + @lru_cache def get_settings() -> Settings: return Settings() diff --git a/app/services/mapset_service.py b/app/services/mapset_service.py index e5d368e..1c22d88 100644 --- a/app/services/mapset_service.py +++ b/app/services/mapset_service.py @@ -24,7 +24,6 @@ from app.core.exceptions import NotFoundException, UnprocessableEntity from . import BaseService - class MapsetService(BaseService[MapsetModel, MapsetRepository]): def __init__( self, @@ -208,6 +207,40 @@ class MapsetService(BaseService[MapsetModel, MapsetRepository]): return mapset + + async def create_system(self, user_id: UUID | None, data: Dict[str, Any]) -> MapsetModel: + now = func.timezone("Asia/Jakarta", func.now()) + + data["created_by"] = user_id + data["updated_by"] = user_id + data["created_at"] = now + data["updated_at"] = now + + track_note = data.pop("notes", None) + source_id = data.pop("source_id", None) + + mapset = await super().create(data) + + if source_id: + if isinstance(source_id, (str, UUID)): + source_id = [source_id] + + await self.source_usage_repository.bulk_create( + [{"mapset_id": mapset.id, "source_id": sid} for sid in source_id] + ) + + await self.history_repository.create( + { + "mapset_id": mapset.id, + "validation_type": mapset.status_validation, + "notes": track_note, + "user_id": user_id, + "timestamp": now, + } + ) + + return mapset + async def update(self, id: UUID, user: UserSchema, data: Dict[str, Any]) -> MapsetModel: data["updated_by"] = user.id data["updated_at"] = func.timezone('Asia/Jakarta', func.now())