1+ package com .datadoghq .stickerlandia .stickeraward ;
2+
3+ import com .datadoghq .stickerlandia .stickeraward .beans .CreateStickerCommand ;
4+ import com .datadoghq .stickerlandia .stickeraward .beans .PagedResponse ;
5+ import com .datadoghq .stickerlandia .stickeraward .beans .StickerAssignmentsResponse ;
6+ import com .datadoghq .stickerlandia .stickeraward .beans .StickerCatalogResponse ;
7+ import com .datadoghq .stickerlandia .stickeraward .beans .StickerCreatedResponse ;
8+ import com .datadoghq .stickerlandia .stickeraward .beans .StickerMetadata ;
9+ import com .datadoghq .stickerlandia .stickeraward .beans .UpdateStickerCommand ;
10+ import com .datadoghq .stickerlandia .stickeraward .beans .UserAssignment ;
11+ import com .datadoghq .stickerlandia .stickeraward .entity .Sticker ;
12+ import com .datadoghq .stickerlandia .stickeraward .entity .StickerAssignment ;
13+ import io .quarkus .hibernate .orm .panache .PanacheQuery ;
14+ import io .quarkus .panache .common .Page ;
15+ import jakarta .enterprise .context .ApplicationScoped ;
16+ import jakarta .transaction .Transactional ;
17+
18+ import java .time .Instant ;
19+ import java .util .Date ;
20+ import java .util .List ;
21+ import java .util .UUID ;
22+ import java .util .stream .Collectors ;
23+
24+ @ ApplicationScoped
25+ public class StickerCatalogService {
26+
27+ @ Transactional
28+ public StickerCreatedResponse createSticker (CreateStickerCommand command ) {
29+ String stickerId = "sticker-" + UUID .randomUUID ().toString ().substring (0 , 8 );
30+
31+ Sticker sticker = new Sticker (
32+ stickerId ,
33+ command .getStickerName (),
34+ command .getStickerDescription (),
35+ null , // Image URL will be set when image is uploaded
36+ command .getStickerQuantityRemaining ()
37+ );
38+
39+ sticker .persist ();
40+
41+ StickerCreatedResponse response = new StickerCreatedResponse ();
42+ response .setStickerId (sticker .getStickerId ());
43+ response .setStickerName (sticker .getName ());
44+ response .setImageUrl (buildImageUrl (sticker .getStickerId ()));
45+ return response ;
46+ }
47+
48+ public StickerCatalogResponse getAllStickers (int page , int size ) {
49+ PanacheQuery <Sticker > query = Sticker .findAll ();
50+ List <Sticker > stickers = query .page (Page .of (page , size )).list ();
51+ long totalCount = query .count ();
52+
53+ List <StickerMetadata > stickerMetadataList = stickers .stream ()
54+ .map (this ::toStickerMetadata )
55+ .collect (Collectors .toList ());
56+
57+ PagedResponse pagination = new PagedResponse ();
58+ pagination .setPage (page );
59+ pagination .setSize (size );
60+ pagination .setTotal ((int ) totalCount );
61+ pagination .setTotalPages ((int ) Math .ceil ((double ) totalCount / size ));
62+
63+ StickerCatalogResponse response = new StickerCatalogResponse ();
64+ response .setStickers (stickerMetadataList );
65+ response .setPagination (pagination );
66+ return response ;
67+ }
68+
69+ public StickerMetadata getStickerMetadata (String stickerId ) {
70+ Sticker sticker = Sticker .findById (stickerId );
71+ if (sticker == null ) {
72+ return null ;
73+ }
74+ return toStickerMetadata (sticker );
75+ }
76+
77+ @ Transactional
78+ public StickerMetadata updateStickerMetadata (String stickerId , UpdateStickerCommand command ) {
79+ Sticker sticker = Sticker .findById (stickerId );
80+ if (sticker == null ) {
81+ return null ;
82+ }
83+
84+ if (command .getStickerName () != null ) {
85+ sticker .setName (command .getStickerName ());
86+ }
87+ if (command .getStickerDescription () != null ) {
88+ sticker .setDescription (command .getStickerDescription ());
89+ }
90+ if (command .getStickerQuantityRemaining () != null ) {
91+ sticker .setStickerQuantityRemaining (command .getStickerQuantityRemaining ());
92+ }
93+
94+ sticker .setUpdatedAt (Instant .now ());
95+ sticker .persist ();
96+
97+ return toStickerMetadata (sticker );
98+ }
99+
100+ @ Transactional
101+ public boolean deleteSticker (String stickerId ) {
102+ Sticker sticker = Sticker .findById (stickerId );
103+ if (sticker == null ) {
104+ return false ;
105+ }
106+
107+ // Check if sticker is assigned to any users
108+ long assignmentCount = StickerAssignment .countActiveByStickerId (stickerId );
109+ if (assignmentCount > 0 ) {
110+ throw new IllegalStateException ("Cannot delete sticker that is assigned to users" );
111+ }
112+
113+ sticker .delete ();
114+ return true ;
115+ }
116+
117+ public StickerAssignmentsResponse getStickerAssignments (String stickerId , int page , int size ) {
118+ Sticker sticker = Sticker .findById (stickerId );
119+ if (sticker == null ) {
120+ return null ;
121+ }
122+
123+ PanacheQuery <StickerAssignment > query = StickerAssignment .find ("sticker.stickerId = ?1 AND removedAt IS NULL" , stickerId );
124+ List <StickerAssignment > assignments = query .page (Page .of (page , size )).list ();
125+ long totalCount = query .count ();
126+
127+ List <UserAssignment > userAssignments = assignments .stream ()
128+ .map (assignment -> {
129+ UserAssignment ua = new UserAssignment ();
130+ ua .setUserId (assignment .getUserId ());
131+ ua .setAssignedAt (Date .from (assignment .getAssignedAt ()));
132+ ua .setReason (assignment .getReason ());
133+ return ua ;
134+ })
135+ .collect (Collectors .toList ());
136+
137+ PagedResponse pagination = new PagedResponse ();
138+ pagination .setPage (page );
139+ pagination .setSize (size );
140+ pagination .setTotal ((int ) totalCount );
141+ pagination .setTotalPages ((int ) Math .ceil ((double ) totalCount / size ));
142+
143+ StickerAssignmentsResponse response = new StickerAssignmentsResponse ();
144+ response .setStickerId (stickerId );
145+ response .setAssignments (userAssignments );
146+ response .setPagination (pagination );
147+ return response ;
148+ }
149+
150+ private StickerMetadata toStickerMetadata (Sticker sticker ) {
151+ StickerMetadata metadata = new StickerMetadata ();
152+ metadata .setStickerId (sticker .getStickerId ());
153+ metadata .setStickerName (sticker .getName ());
154+ metadata .setStickerDescription (sticker .getDescription ());
155+ metadata .setStickerQuantityRemaining (sticker .getStickerQuantityRemaining ());
156+ metadata .setImageUrl (buildImageUrl (sticker .getStickerId ()));
157+ metadata .setCreatedAt (Date .from (sticker .getCreatedAt ()));
158+ metadata .setUpdatedAt (sticker .getUpdatedAt () != null ? Date .from (sticker .getUpdatedAt ()) : null );
159+ return metadata ;
160+ }
161+
162+ private String buildImageUrl (String stickerId ) {
163+ return "/api/award/v1/stickers/" + stickerId + "/image" ;
164+ }
165+ }
0 commit comments