77use OpenApi \Attributes as OA ;
88use PhpList \Core \Security \Authentication ;
99use PhpList \RestBundle \Controller \Traits \AuthenticationTrait ;
10+ use PhpList \RestBundle \Entity \Request \CreateMessageRequest ;
1011use PhpList \RestBundle \Serializer \MessageNormalizer ;
12+ use PhpList \RestBundle \Service \Manager \MessageManager ;
1113use PhpList \RestBundle \Service \Provider \MessageProvider ;
1214use PhpList \RestBundle \Validator \RequestValidator ;
1315use Symfony \Bundle \FrameworkBundle \Controller \AbstractController ;
1719use Symfony \Component \Routing \Attribute \Route ;
1820
1921/**
20- * This controller provides REST API manage campaigns.
22+ * This controller provides REST API to manage campaigns.
2123 *
2224 * @author Tatevik Grigoryan <[email protected] > 2325 */
@@ -29,17 +31,20 @@ class CampaignController extends AbstractController
2931 private MessageProvider $ messageProvider ;
3032 private RequestValidator $ validator ;
3133 private MessageNormalizer $ normalizer ;
34+ private MessageManager $ messageManager ;
3235
3336 public function __construct (
3437 Authentication $ authentication ,
3538 MessageProvider $ messageProvider ,
3639 RequestValidator $ validator ,
37- MessageNormalizer $ normalizer
40+ MessageNormalizer $ normalizer ,
41+ MessageManager $ messageManager
3842 ) {
3943 $ this ->authentication = $ authentication ;
4044 $ this ->messageProvider = $ messageProvider ;
4145 $ this ->validator = $ validator ;
4246 $ this ->normalizer = $ normalizer ;
47+ $ this ->messageManager = $ messageManager ;
4348 }
4449
4550 #[Route('' , name: 'get_campaigns ' , methods: ['GET ' ])]
@@ -86,4 +91,126 @@ public function getMessages(Request $request): JsonResponse
8691
8792 return new JsonResponse ($ normalized , Response::HTTP_OK );
8893 }
94+
95+ #[Route('' , name: 'create_message ' , methods: ['POST ' ])]
96+ #[OA \Post(
97+ path: '/campaigns ' ,
98+ description: 'Returns created message. ' ,
99+ summary: 'Create a message for campaign. ' ,
100+ requestBody: new OA \RequestBody (
101+ description: 'Create a new message. ' ,
102+ required: true ,
103+ content: new OA \JsonContent (
104+ properties: [
105+ new OA \Property (
106+ property: 'message_content ' ,
107+ properties: [
108+ new OA \Property (property: 'subject ' , type: 'string ' , example: 'Campaign Subject ' ),
109+ new OA \Property (property: 'text ' , type: 'string ' , example: 'Full text content ' ),
110+ new OA \Property (property: 'text_message ' , type: 'string ' , example: 'Short text message ' ),
111+ new OA \Property (property: 'footer ' , type: 'string ' , example: 'Unsubscribe link here ' ),
112+ ],
113+ type: 'object '
114+ ),
115+ new OA \Property (
116+ property: 'message_format ' ,
117+ properties: [
118+ new OA \Property (property: 'html_formated ' , type: 'boolean ' , example: true ),
119+ new OA \Property (
120+ property: 'send_format ' ,
121+ type: 'string ' ,
122+ enum: ['html ' , 'text ' , 'invite ' ],
123+ example: 'html '
124+ ),
125+ new OA \Property (
126+ property: 'format_options ' ,
127+ type: 'array ' ,
128+ items: new OA \Items (type: 'string ' , enum: ['text ' , 'html ' , 'pdf ' ]),
129+ example: ['html ' ]
130+ ),
131+ ],
132+ type: 'object '
133+ ),
134+ new OA \Property (
135+ property: 'message_metadata ' ,
136+ properties: [
137+ new OA \Property (property: 'status ' , type: 'string ' , example: 'draft ' ),
138+ ],
139+ type: 'object '
140+ ),
141+ new OA \Property (
142+ property: 'message_schedule ' ,
143+ properties: [
144+ new OA \Property (property: 'repeat_interval ' , type: 'string ' , example: '24 hours ' ),
145+ new OA \Property (
146+ property: 'repeat_until ' ,
147+ type: 'string ' ,
148+ format: 'date-time ' ,
149+ example: '2025-04-30T00:00:00+04:00 '
150+ ),
151+ new OA \Property (property: 'requeue_interval ' , type: 'string ' , example: '12 hours ' ),
152+ new OA \Property (
153+ property: 'requeue_until ' ,
154+ type: 'string ' ,
155+ format: 'date-time ' ,
156+ example: '2025-04-20T00:00:00+04:00 '
157+ ),
158+ ],
159+ type: 'object '
160+ ),
161+ new OA \Property (
162+ property: 'message_options ' ,
163+ properties: [
164+ new OA \
Property (property:
'from_field ' , type:
'string ' , example:
'[email protected] ' ),
165+ new OA \
Property (property:
'to_field ' , type:
'string ' , example:
'[email protected] ' ),
166+ new OA \
Property (property:
'reply_to ' , type:
'string ' , example:
'[email protected] ' ),
167+ new OA \Property (property: 'embargo ' , type: 'string ' , example: '2025-04-17 09:00:00 ' ),
168+ new OA \Property (property: 'user_selection ' , type: 'string ' , example: 'all-active-users ' ),
169+ ],
170+ type: 'object '
171+ ),
172+ ],
173+ type: 'object '
174+ )
175+ ),
176+ tags: ['campaigns ' ],
177+ parameters: [
178+ new OA \Parameter (
179+ name: 'session ' ,
180+ description: 'Session ID obtained from authentication ' ,
181+ in: 'header ' ,
182+ required: true ,
183+ schema: new OA \Schema (
184+ type: 'string '
185+ )
186+ )
187+ ],
188+ responses: [
189+ new OA \Response (
190+ response: 201 ,
191+ description: 'Success ' ,
192+ content: new OA \JsonContent (ref: '#/components/schemas/Message ' )
193+ ),
194+ new OA \Response (
195+ response: 403 ,
196+ description: 'Failure ' ,
197+ content: new OA \JsonContent (ref: '#/components/schemas/UnauthorizedResponse ' )
198+ ),
199+ new OA \Response (
200+ response: 422 ,
201+ description: 'Failure ' ,
202+ content: new OA \JsonContent (ref: '#/components/schemas/ValidationErrorResponse ' )
203+ ),
204+ ]
205+ )]
206+ public function createMessage (Request $ request , MessageNormalizer $ normalizer ): JsonResponse
207+ {
208+ $ authUser = $ this ->requireAuthentication ($ request );
209+
210+ /** @var CreateMessageRequest $createMessageRequest */
211+ $ createMessageRequest = $ this ->validator ->validate ($ request , CreateMessageRequest::class);
212+ $ data = $ this ->messageManager ->createMessage ($ createMessageRequest , $ authUser );
213+
214+ return new JsonResponse ($ normalizer ->normalize ($ data ), Response::HTTP_CREATED );
215+ }
89216}
0 commit comments