99use PhpList \Core \Domain \Repository \Messaging \TemplateRepository ;
1010use PhpList \Core \Security \Authentication ;
1111use PhpList \RestBundle \Controller \Traits \AuthenticationTrait ;
12+ use PhpList \RestBundle \Entity \Request \CreateTemplateRequest ;
1213use PhpList \RestBundle \Serializer \TemplateNormalizer ;
14+ use PhpList \RestBundle \Service \Manager \TemplateManager ;
15+ use PhpList \RestBundle \Validator \RequestValidator ;
1316use Symfony \Bridge \Doctrine \Attribute \MapEntity ;
1417use Symfony \Bundle \FrameworkBundle \Controller \AbstractController ;
1518use Symfony \Component \HttpFoundation \JsonResponse ;
@@ -29,15 +32,21 @@ class TemplateController extends AbstractController
2932
3033 private TemplateRepository $ templateRepository ;
3134 private TemplateNormalizer $ normalizer ;
35+ private RequestValidator $ validator ;
36+ private TemplateManager $ templateManager ;
3237
3338 public function __construct (
3439 Authentication $ authentication ,
3540 TemplateRepository $ templateRepository ,
3641 TemplateNormalizer $ normalizer ,
42+ RequestValidator $ validator ,
43+ TemplateManager $ templateManager
3744 ) {
3845 $ this ->authentication = $ authentication ;
3946 $ this ->templateRepository = $ templateRepository ;
4047 $ this ->normalizer = $ normalizer ;
48+ $ this ->validator = $ validator ;
49+ $ this ->templateManager = $ templateManager ;
4150 }
4251
4352 #[Route('' , name: 'get_templates ' , methods: ['GET ' ])]
@@ -130,4 +139,104 @@ public function getTemplate(
130139
131140 return new JsonResponse ($ this ->normalizer ->normalize ($ template ), Response::HTTP_OK );
132141 }
142+
143+ #[Route('' , name: 'create_template ' , methods: ['POST ' ])]
144+ #[OA \Post(
145+ path: '/templates ' ,
146+ description: 'Returns a JSON response of created template. ' ,
147+ summary: 'Create a new template. ' ,
148+ requestBody: new OA \RequestBody (
149+ description: 'Pass session credentials ' ,
150+ required: true ,
151+ content: new OA \MediaType (
152+ mediaType: 'multipart/form-data ' ,
153+ schema: new OA \Schema (
154+ required: ['title ' ],
155+ properties: [
156+ new OA \Property (
157+ property: 'title ' ,
158+ type: 'string ' ,
159+ example: 'Newsletter Template '
160+ ),
161+ new OA \Property (
162+ property: 'content ' ,
163+ type: 'string ' ,
164+ example: '<html><body>[CONTENT]</body></html> '
165+ ),
166+ new OA \Property (
167+ property: 'text ' ,
168+ type: 'string ' ,
169+ example: '[CONTENT] '
170+ ),
171+ new OA \Property (
172+ property: 'file ' ,
173+ description: 'Optional file upload for HTML content ' ,
174+ type: 'string ' ,
175+ format: 'binary '
176+ ),
177+ new OA \Property (
178+ property: 'check_links ' ,
179+ description: 'Check that all links have full URLs ' ,
180+ type: 'boolean ' ,
181+ example: true
182+ ),
183+ new OA \Property (
184+ property: 'check_images ' ,
185+ description: 'Check that all images have full URLs ' ,
186+ type: 'boolean ' ,
187+ example: false
188+ ),
189+ new OA \Property (
190+ property: 'check_external_images ' ,
191+ description: 'Check that all external images exist ' ,
192+ type: 'boolean ' ,
193+ example: true
194+ ),
195+ ],
196+ type: 'object '
197+ )
198+ )
199+ ),
200+ tags: ['templates ' ],
201+ parameters: [
202+ new OA \Parameter (
203+ name: 'session ' ,
204+ description: 'Session ID obtained from authentication ' ,
205+ in: 'header ' ,
206+ required: true ,
207+ schema: new OA \Schema (
208+ type: 'string '
209+ )
210+ )
211+ ],
212+ responses: [
213+ new OA \Response (
214+ response: 201 ,
215+ description: 'Success ' ,
216+ content: new OA \JsonContent (
217+ type: 'array ' ,
218+ items: new OA \Items (ref: '#/components/schemas/Template ' )
219+ )
220+ ),
221+ new OA \Response (
222+ response: 403 ,
223+ description: 'Failure ' ,
224+ content: new OA \JsonContent (ref: '#/components/schemas/UnauthorizedResponse ' )
225+ ),
226+ new OA \Response (
227+ response: 422 ,
228+ description: 'Failure ' ,
229+ content: new OA \JsonContent (ref: '#/components/schemas/ValidationErrorResponse ' )
230+ ),
231+ ]
232+ )]
233+ public function createTemplates (Request $ request ): JsonResponse
234+ {
235+ $ this ->requireAuthentication ($ request );
236+
237+ /** @var CreateTemplateRequest $createTemplateRequest */
238+ $ createTemplateRequest = $ this ->validator ->validate ($ request , CreateTemplateRequest::class);
239+
240+ return new JsonResponse ($ this ->templateManager ->create ($ createTemplateRequest ), Response::HTTP_CREATED );
241+ }
133242}
0 commit comments