|
6 | 6 | from notora.v2.models.base import GenericBaseModel |
7 | 7 | from notora.v2.repositories.base import SoftDeleteRepositoryProtocol |
8 | 8 | from notora.v2.repositories.types import FilterSpec |
| 9 | +from notora.v2.schemas.base import BaseResponseSchema |
9 | 10 | from notora.v2.services.mixins.accessors import RepositoryAccessorMixin |
10 | 11 | from notora.v2.services.mixins.executor import SessionExecutorMixin |
| 12 | +from notora.v2.services.mixins.serializer import SerializerProtocol |
11 | 13 | from notora.v2.services.mixins.updated_by import UpdatedByServiceMixin |
12 | 14 |
|
13 | 15 |
|
14 | | -class DeleteServiceMixin[PKType, ModelType: GenericBaseModel]( |
| 16 | +class DeleteServiceMixin[ |
| 17 | + PKType, |
| 18 | + ModelType: GenericBaseModel, |
| 19 | + DetailSchema: BaseResponseSchema, |
| 20 | + ListSchema: BaseResponseSchema = DetailSchema, |
| 21 | +]( |
15 | 22 | SessionExecutorMixin[PKType, ModelType], |
16 | 23 | RepositoryAccessorMixin[PKType, ModelType], |
| 24 | + UpdatedByServiceMixin[PKType, ModelType], |
| 25 | + SerializerProtocol[ModelType, DetailSchema, ListSchema], |
17 | 26 | ): |
18 | | - async def delete(self, session: AsyncSession, pk: PKType) -> None: |
19 | | - await self.execute(session, self.repo.delete(pk)) |
| 27 | + async def delete_raw(self, session: AsyncSession, pk: PKType) -> ModelType: |
| 28 | + return await self.execute_for_one(session, self.repo.delete(pk)) |
| 29 | + |
| 30 | + async def delete( |
| 31 | + self, |
| 32 | + session: AsyncSession, |
| 33 | + pk: PKType, |
| 34 | + *, |
| 35 | + schema: type[DetailSchema] | None = None, |
| 36 | + ) -> DetailSchema: |
| 37 | + entity = await self.delete_raw(session, pk) |
| 38 | + return self.serialize_one(entity, schema=schema) |
| 39 | + |
| 40 | + async def delete_by_raw( |
| 41 | + self, |
| 42 | + session: AsyncSession, |
| 43 | + filters: Iterable[FilterSpec[ModelType]], |
| 44 | + ) -> list[ModelType]: |
| 45 | + return await self.execute_for_many(session, self.repo.delete_by(filters=filters)) |
20 | 46 |
|
21 | 47 | async def delete_by( |
22 | 48 | self, |
23 | 49 | session: AsyncSession, |
24 | 50 | filters: Iterable[FilterSpec[ModelType]], |
25 | | - ) -> None: |
26 | | - await self.execute(session, self.repo.delete_by(filters=filters)) |
| 51 | + *, |
| 52 | + schema: type[ListSchema] | None = None, |
| 53 | + ) -> list[ListSchema]: |
| 54 | + entities = await self.delete_by_raw(session, filters) |
| 55 | + return self.serialize_many(entities, schema=schema) |
27 | 56 |
|
28 | 57 |
|
29 | | -class SoftDeleteServiceMixin[PKType, ModelType: GenericBaseModel]( |
30 | | - DeleteServiceMixin[PKType, ModelType], |
31 | | - UpdatedByServiceMixin[PKType, ModelType], |
| 58 | +class SoftDeleteServiceMixin[ |
| 59 | + PKType, |
| 60 | + ModelType: GenericBaseModel, |
| 61 | + DetailSchema: BaseResponseSchema, |
| 62 | + ListSchema: BaseResponseSchema = DetailSchema, |
| 63 | +]( |
| 64 | + DeleteServiceMixin[PKType, ModelType, DetailSchema, ListSchema], |
32 | 65 | ): |
33 | 66 | repo: SoftDeleteRepositoryProtocol[PKType, ModelType] |
34 | 67 |
|
35 | | - async def soft_delete( |
| 68 | + async def soft_delete_raw( |
36 | 69 | self, |
37 | 70 | session: AsyncSession, |
38 | 71 | pk: PKType, |
39 | 72 | *, |
40 | 73 | actor_id: Any | None = None, |
41 | | - ) -> None: |
| 74 | + ) -> ModelType: |
42 | 75 | additional_payload = self._apply_updated_by({}, actor_id) or None |
43 | | - await self.execute_for_one( |
| 76 | + return await self.execute_for_one( |
44 | 77 | session, |
45 | 78 | self.repo.soft_delete(pk, additional_payload=additional_payload), |
46 | 79 | ) |
47 | 80 |
|
48 | | - async def soft_delete_by( |
| 81 | + async def soft_delete( |
| 82 | + self, |
| 83 | + session: AsyncSession, |
| 84 | + pk: PKType, |
| 85 | + *, |
| 86 | + actor_id: Any | None = None, |
| 87 | + schema: type[DetailSchema] | None = None, |
| 88 | + ) -> DetailSchema: |
| 89 | + entity = await self.soft_delete_raw(session, pk, actor_id=actor_id) |
| 90 | + return self.serialize_one(entity, schema=schema) |
| 91 | + |
| 92 | + async def soft_delete_by_raw( |
49 | 93 | self, |
50 | 94 | session: AsyncSession, |
51 | 95 | filters: Iterable[FilterSpec[ModelType]], |
52 | 96 | *, |
53 | 97 | actor_id: Any | None = None, |
54 | | - ) -> None: |
| 98 | + ) -> list[ModelType]: |
55 | 99 | additional_payload = self._apply_updated_by({}, actor_id) or None |
56 | | - await self.execute( |
| 100 | + return await self.execute_for_many( |
57 | 101 | session, |
58 | 102 | self.repo.soft_delete_by( |
59 | 103 | filters=filters, |
60 | 104 | additional_payload=additional_payload, |
61 | 105 | ), |
62 | 106 | ) |
| 107 | + |
| 108 | + async def soft_delete_by( |
| 109 | + self, |
| 110 | + session: AsyncSession, |
| 111 | + filters: Iterable[FilterSpec[ModelType]], |
| 112 | + *, |
| 113 | + actor_id: Any | None = None, |
| 114 | + schema: type[ListSchema] | None = None, |
| 115 | + ) -> list[ListSchema]: |
| 116 | + entities = await self.soft_delete_by_raw(session, filters, actor_id=actor_id) |
| 117 | + return self.serialize_many(entities, schema=schema) |
0 commit comments