create API for news item + testing if fetch works : to be generalized to accomodate other types of dashboard items

This commit is contained in:
Julie Lenaerts 2023-11-01 16:26:19 +01:00
parent a542d319f7
commit 3a6d5fc22a
5 changed files with 125 additions and 5 deletions

View File

@ -0,0 +1,24 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\MainBundle\Controller;
use Chill\MainBundle\CRUD\Controller\ApiController;
use Chill\MainBundle\Pagination\PaginatorInterface;
use Symfony\Component\HttpFoundation\Request;
class NewsItemApiController extends ApiController
{
protected function orderQuery(string $action, $query, Request $request, PaginatorInterface $paginator, $_format)
{
return $query->addOrderBy('e.startDate', 'ASC');
}
}

View File

@ -1,7 +1,7 @@
<template>
<span v-if="noResults" class="chill-no-data-statement">{{ $t('no_dashboard') }}</span>
<div v-else id="dashboards" class="row g-3" data-masonry='{"percentPosition": true }'>
<div class="mbloc col col-sm-6 col-lg-4">
<div class="custom1">
<ul class="list-unstyled">
@ -38,7 +38,7 @@
</ul>
</div>
</div>
<!--
<div class="mbloc col col-sm-6 col-lg-4">
<div class="custom2">
@ -98,4 +98,4 @@ span.counter {
background-color: unset;
}
}
</style>
</style>

View File

@ -24,6 +24,7 @@ const store = createStore({
workflows: {},
workflowsCc: {},
errorMsg: [],
newsItems: {},
loading: false
},
getters: {
@ -96,12 +97,26 @@ const store = createStore({
},
catchError(state, error) {
state.errorMsg.push(error);
},
addNewsItems(state, newsItems) {
state.newsItems = newsItems;
}
},
actions: {
getByTab({ commit, getters }, { tab, param }) {
switch (tab) {
case 'MyCustoms':
const url = `/api/1.0/main/news.json`;
makeFetch('GET', url)
.then((response) => {
console.log('news', response.results)
commit('addNewsItems', response);
})
.catch((error) => {
commit('catchError', error);
throw error;
})
;
break;
// case 'MyWorks':
// if (!getters.isWorksLoaded) {
@ -221,8 +236,8 @@ const store = createStore({
default:
throw 'tab '+ tab;
}
}
},
},
});
export { store };
export { store };

View File

@ -0,0 +1,43 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\MainBundle\Serializer\Normalizer;
use Chill\MainBundle\Entity\Center;
use Chill\MainBundle\Entity\NewsItem;
use Chill\MainBundle\Repository\CenterRepository;
use Symfony\Component\Serializer\Exception\InvalidArgumentException;
use Symfony\Component\Serializer\Exception\UnexpectedValueException;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
class NewsItemNormalizer implements NormalizerInterface
{
public function __construct(private readonly CenterRepository $repository) {}
public function normalize($newsItem, $format = null, array $context = [])
{
/* @var NewsItem $newsItem */
return [
'id' => $newsItem->getId(),
'type' => 'news',
'title' => $newsItem->getTitle(),
'content' => $newsItem->getContent(),
'startdate' => $newsItem->getStartDate(),
'enddate' => $newsItem->getEndDate()
];
}
public function supportsNormalization($data, $format = null): bool
{
return $data instanceof NewsItem && 'json' === $format;
}
}

View File

@ -10,6 +10,12 @@ servers:
components:
schemas:
Date:
type: object
properties:
datetime:
type: string
format: date-time
User:
type: object
properties:
@ -131,6 +137,22 @@ components:
id:
type: integer
News:
type: object
properties:
id:
type: integer
type:
type: string
title:
type: string
content:
type: string
startdate:
$ref: "#/components/schemas/Date"
enddate:
$ref: "#/components/schemas/Date"
paths:
/1.0/search.json:
get:
@ -842,4 +864,20 @@ paths:
$ref: '#/components/schemas/Workflow'
403:
description: "Unauthorized"
/1.0/main/news.json:
get:
tags:
- news
summary: Returns a list of news items
responses:
200:
description: "ok"
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/News'
403:
description: "Unauthorized"