Skip to content

Commit 5e6ecce

Browse files
author
Mario G.
committed
fix(users): update user's image
1 parent 4c41e59 commit 5e6ecce

File tree

7 files changed

+47
-14
lines changed

7 files changed

+47
-14
lines changed

src/liceo/infra/adapters/migrations/20250915_initial_migration.sql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,11 @@ CREATE TABLE IF NOT EXISTS liceo_users_images (
7777
dimension TEXT DEFAULT 'original', -- small, medium, large, original
7878
created_at TIMESTAMP NOT NULL,
7979
created_by TEXT NOT NULL,
80+
last_updated_at TIMESTAMP,
81+
last_updated_by TEXT,
82+
UNIQUE("user_id", "dimension"),
8083
CONSTRAINT fk_users_images_created_by FOREIGN KEY (created_by) REFERENCES liceo_users(id),
84+
CONSTRAINT fk_users_images_last_updated_by FOREIGN KEY (last_updated_by) REFERENCES liceo_users(id),
8185
CONSTRAINT fk_users_images_users FOREIGN KEY (user_id) REFERENCES liceo_users(id),
8286
CONSTRAINT fk_users_images_storage FOREIGN KEY (storage_id) REFERENCES liceo_storage(id)
8387
);

src/liceo/security/users/adapters/repositories.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from liceo.infra.domain.vo import Paged, AuditInfo
2-
from liceo.security.users.application.dtos import FilterUsersDTO, UserDTO, SaveUserImageDTO
2+
from liceo.security.users.application.dtos import FilterUsersDTO, UserDTO, UpsertUserImageDTO
33
from liceo.security.users.domain.entities import User
44
from liceo.labs.db.sql import SQLRepository, sql
55
from ..application.repository import UsersRepository, UsersImagesRepository
@@ -137,12 +137,16 @@ def update_security(self, user: User) -> User:
137137

138138

139139
class SQLUsersImagesRepository(UsersImagesRepository, SQLRepository):
140-
def save_user_image(self, dto: SaveUserImageDTO) -> None:
140+
def save_user_image(self, dto: UpsertUserImageDTO) -> None:
141141
sql = self.resolve_sql(self.save_user_image)
142-
self._get_connection().execute(sql, params={
142+
params = params = {
143143
"user_id": dto.user_id,
144144
"storage_id": dto.photo_id,
145145
"dimension": dto.dimension,
146146
"created_at": dto.created_at,
147-
"created_by": dto.created_by
148-
})
147+
"created_by": dto.created_by,
148+
"last_updated_by": dto.last_updated_by,
149+
"last_updated_at": dto.last_updated_at
150+
}
151+
print(params)
152+
self._get_connection().execute(sql, params)

src/liceo/security/users/adapters/service.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from datetime import datetime
12
from dataclasses import dataclass
23
from liceo.infra.domain.vo import Paged
34
from liceo.labs.sherlock.application.service import EventStoreService
@@ -53,7 +54,7 @@ def list(self, input: dtos.FilterUsersDTO) -> Paged[dtos.UserDTO]:
5354
def _save_user_photo(self, user: entities.User) -> None:
5455
if user.photo:
5556
self.images.save_user_image(
56-
dtos.SaveUserImageDTO(
57+
dtos.UpsertUserImageDTO(
5758
user_id=user.id.id,
5859
photo_id=user.photo,
5960
dimension="original",
@@ -62,6 +63,21 @@ def _save_user_photo(self, user: entities.User) -> None:
6263
)
6364
)
6465

66+
def _update_user_photo(self, user: entities.User, updated_by: dtos.CurrentUserDTO) -> None:
67+
if user.photo:
68+
photo_created_at = datetime.now()
69+
self.images.save_user_image(
70+
dtos.UpsertUserImageDTO(
71+
user_id=user.id.id,
72+
photo_id=user.photo,
73+
dimension="original",
74+
created_at=photo_created_at,
75+
created_by=updated_by.id,
76+
last_updated_at=photo_created_at,
77+
last_updated_by=updated_by.id
78+
)
79+
)
80+
6581
@transactional()
6682
def create_user(self, input: dtos.CreateUserDTO) -> entities.User:
6783
command = entities.User.CreateUserCommand(
@@ -99,8 +115,8 @@ def update_user(self, input: dtos.UpdateUserDetailsDTO) -> entities.User | None:
99115
))
100116
# saving user
101117
saved_user = self.users.update_user(updated)
102-
# saving user photo
103-
self._save_user_photo(saved_user)
118+
# update user photo
119+
self._update_user_photo(saved_user, input.updated_by)
104120
# saving event trail
105121
self.event_store.append(saved_user)
106122
# return saved_user

src/liceo/security/users/adapters/sql/save_user_image.sql

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,10 @@ VALUES
1313
:dimension,
1414
:created_at,
1515
:created_by
16-
);
16+
)
17+
ON CONFLICT (user_id, dimension)
18+
DO UPDATE SET
19+
storage_id=:storage_id,
20+
dimension=:dimension,
21+
last_updated_at=:last_updated_at,
22+
last_updated_by=:last_updated_by;

src/liceo/security/users/application/dtos.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,14 @@ class UserDTO:
4141

4242

4343
@dataclass
44-
class SaveUserImageDTO:
44+
class UpsertUserImageDTO:
4545
user_id: str
4646
photo_id: str
4747
dimension: str
48-
created_by: str
49-
created_at: datetime
48+
created_by: str | None = field(default=None)
49+
created_at: datetime | None = field(default=datetime.now())
50+
last_updated_by: str | None = field(default=None)
51+
last_updated_at: datetime | None = field(default=datetime.now())
5052

5153

5254
@dataclass

src/liceo/security/users/application/repository.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from liceo.infra.application.output import AbstractRepository
33
from liceo.infra.domain.vo import Paged
44
from ..domain.entities import User
5-
from .dtos import FilterUsersDTO, UserDTO, SaveUserImageDTO
5+
from .dtos import FilterUsersDTO, UserDTO, UpsertUserImageDTO
66

77

88
class UsersRepository(AbstractRepository):
@@ -33,5 +33,5 @@ def update_security(self, user: User) -> User:
3333

3434
class UsersImagesRepository(AbstractRepository):
3535
@abstractmethod
36-
def save_user_image(self, dto: SaveUserImageDTO) -> None:
36+
def save_user_image(self, dto: UpsertUserImageDTO) -> None:
3737
pass

src/liceo/security/users/domain/entities.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class DetailsChanged(AggregateEvent):
3131

3232
def handle(self, aggregate: "User"):
3333
aggregate.mark_updated_by(self.changed_by)
34+
aggregate.photo = self.photo
3435
aggregate.name = self.name
3536
aggregate.surname = self.surname
3637
aggregate.username = self.username

0 commit comments

Comments
 (0)