add microservice service

This commit is contained in:
DmsAnhr 2026-01-28 12:45:19 +07:00
parent 04e1199ee9
commit d4eaf4f388
4 changed files with 56 additions and 3 deletions

View File

@ -1,7 +1,7 @@
from datetime import datetime from datetime import datetime
from typing import Optional 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 import OAuth2PasswordBearer
from fastapi.security.utils import get_authorization_scheme_param from fastapi.security.utils import get_authorization_scheme_param
from jose import JWTError from jose import JWTError
@ -98,3 +98,9 @@ async def get_current_active_admin(current_user: UserSchema = Depends(get_curren
) )
return current_user 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")

View File

@ -2,7 +2,7 @@ from typing import List
from fastapi import APIRouter, Body, Depends, status 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.api.dependencies.factory import Factory
from app.core.data_types import UUID7Field from app.core.data_types import UUID7Field
from app.core.params import CommonParams from app.core.params import CommonParams
@ -83,6 +83,16 @@ async def create_mapset(
mapset = await service.create(user, data.dict()) mapset = await service.create(user, data.dict())
return mapset 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) @router.post("/mapsets/color_scale", status_code=status.HTTP_200_OK)
async def create_color_scale( async def create_color_scale(

View File

@ -1,3 +1,4 @@
import os
from functools import lru_cache from functools import lru_cache
from typing import List, Optional 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") model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", case_sensitive=True, extra="allow")
# Microservice Key
SERVICE_KEY : str
@lru_cache @lru_cache
def get_settings() -> Settings: def get_settings() -> Settings:
return Settings() return Settings()

View File

@ -24,7 +24,6 @@ from app.core.exceptions import NotFoundException, UnprocessableEntity
from . import BaseService from . import BaseService
class MapsetService(BaseService[MapsetModel, MapsetRepository]): class MapsetService(BaseService[MapsetModel, MapsetRepository]):
def __init__( def __init__(
self, self,
@ -208,6 +207,40 @@ class MapsetService(BaseService[MapsetModel, MapsetRepository]):
return mapset 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: async def update(self, id: UUID, user: UserSchema, data: Dict[str, Any]) -> MapsetModel:
data["updated_by"] = user.id data["updated_by"] = user.id
data["updated_at"] = func.timezone('Asia/Jakarta', func.now()) data["updated_at"] = func.timezone('Asia/Jakarta', func.now())