DefaultController   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 256
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Importance

Changes 0
Metric Value
wmc 13
lcom 1
cbo 6
dl 0
loc 256
rs 10
c 0
b 0
f 0

11 Methods

Rating   Name   Duplication   Size   Complexity  
A setContainer() 0 5 1
A cleanAction() 0 5 1
A coffeeAction() 0 6 1
A dirtyAction() 0 4 1
A loginAction() 0 4 1
A maintenanceLockAction() 0 7 2
A maintenanceUnlockAction() 0 6 1
A pingAction() 0 4 1
A searchAction() 0 13 2
A versionAction() 0 4 1
A configAction() 0 25 1
1
<?php
2
3
namespace KI\CoreBundle\Controller;
4
5
use Nelmio\ApiDocBundle\Annotation\ApiDoc;
6
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
7
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
8
use Symfony\Component\DependencyInjection\ContainerInterface;
9
use Symfony\Component\HttpFoundation\IpUtils;
10
use Symfony\Component\HttpFoundation\Request;
11
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
12
13
class DefaultController extends BaseController
14
{
15
    public function setContainer(ContainerInterface $container = null)
16
    {
17
        parent::setContainer($container);
18
        $this->initialize('User', 'User');
19
    }
20
21
    /**
22
     * @ApiDoc(
23
     *  description="Procédure de nettoyage de la BDD à lancer régulièrement",
24
     *  statusCodes={
25
     *   204="Requête traitée avec succès mais pas d’information à renvoyer",
26
     *   401="Une authentification est nécessaire pour effectuer cette action",
27
     *   403="Pas les droits suffisants pour effectuer cette action",
28
     *   503="Service temporairement indisponible ou en maintenance",
29
     *  },
30
     *  section="Général"
31
     * )
32
     * @Route("/clean")
33
     * @Method("GET")
34
     */
35
    public function cleanAction()
36
    {
37
        $this->get('ki_core.helper.cleaning')->clean();
38
        return $this->json(null, 204);
39
    }
40
41
    /**
42
     * @ApiDoc(
43
     *  description="Avoir du café",
44
     *  statusCodes={
45
     *   418="Je suis une théière",
46
     *   503="Service temporairement indisponible ou en maintenance",
47
     *  },
48
     *  section="Général"
49
     * )
50
     * @Route("/coffee")
51
     * @Method("GET")
52
     */
53
    public function coffeeAction()
54
    {
55
        $engine = $this->get('templating');
56
        $content = $engine->render('KICoreBundle::coffee.html.twig');
57
        return $this->htmlResponse($content, 418);
58
    }
59
60
    /**
61
     * @ApiDoc(
62
     *  description="Let's get dirty !",
63
     *  statusCodes={
64
     *   202="Requête traitée mais sans garantie de résultat",
65
     *   401="Une authentification est nécessaire pour effectuer cette action",
66
     *   403="Pas les droits suffisants pour effectuer cette action",
67
     *   503="Service temporairement indisponible ou en maintenance",
68
     *  },
69
     *  section="Général"
70
     * )
71
     * @Route("/dirty")
72
     * @Method("GET")
73
     */
74
    public function dirtyAction()
75
    {
76
        return $this->redirect('https://www.youtube.com/watch?v=dQw4w9WgXcQ');
77
    }
78
79
    /**
80
     * Ceci sert juste à documenter cette route, le reste est géré par le LexikJWTAuthenticationBundle
81
     * @ApiDoc(
82
     *  description="Se loger et recevoir un JSON Web Token",
83
     *  requirements={
84
     *   {
85
     *    "name"="username",
86
     *    "dataType"="string",
87
     *    "description"="Le nom d'utilisateur (format : sept premières lettres du nom et première lettre du prénom)"
88
     *   },
89
     *   {
90
     *    "name"="password",
91
     *    "dataType"="string",
92
     *    "description"="Le mot de passe en clair"
93
     *   }
94
     *  },
95
     *  statusCodes={
96
     *   200="Requête traitée avec succès",
97
     *   401="Mauvaise combinaison username/password ou champ nom rempli",
98
     *   502="Erreur Proxy : l'utilisateur se connecte pour la première fois, mais le proxy DSI n'est pas configuré",
99
     *   503="Service temporairement indisponible ou en maintenance",
100
     *  },
101
     *  section="Général"
102
     * )
103
     * @Route("/login", name="login")
104
     * @Method("POST")
105
     */
106
    public function loginAction()
107
    {
108
        return $this->json(null);
109
    }
110
111
    /**
112
     * @ApiDoc(
113
     *  description="Mettre le serveur en mode maintenance",
114
     *  parameters={
115
     *   {
116
     *    "name"="until",
117
     *    "dataType"="integer",
118
     *    "required"=false,
119
     *    "description"="La date prévue de remise en route du service (timestamp)"
120
     *   }
121
     *  },
122
     *  statusCodes={
123
     *   204="Requête traitée avec succès mais pas d’information à renvoyer",
124
     *   401="Une authentification est nécessaire pour effectuer cette action",
125
     *   403="Pas les droits suffisants pour effectuer cette action",
126
     *  },
127
     *  section="Général"
128
     * )
129
     * @Route("/maintenance")
130
     * @Method("POST")
131
     */
132
    public function maintenanceLockAction(Request $request)
133
    {
134
        $this->trust($this->is('ADMIN'));
135
        $until = $request->request->has('until') ? (string)$request->request->get('until') : '';
136
        $this->get('ki_core.service.maintenance')->lock($until);
137
        return $this->json(null, 204);
138
    }
139
140
    /**
141
     * @ApiDoc(
142
     *  description="Sortir le serveur du mode maintenance",
143
     *  statusCodes={
144
     *   204="Requête traitée avec succès mais pas d’information à renvoyer",
145
     *   401="Une authentification est nécessaire pour effectuer cette action",
146
     *   403="Pas les droits suffisants pour effectuer cette action",
147
     *  },
148
     *  section="Général"
149
     * )
150
     * @Route("/maintenance")
151
     * @Method("DELETE")
152
     */
153
    public function maintenanceUnlockAction()
154
    {
155
        $this->trust($this->is('ADMIN'));
156
        $this->get('ki_core.service.maintenance')->unlock();
157
        return $this->json(null, 204);
158
    }
159
160
    /**
161
     * @ApiDoc(
162
     *  description="Pinger l'API",
163
     *  statusCodes={
164
     *   204="Requête traitée avec succès mais pas d’information à renvoyer",
165
     *   401="Une authentification est nécessaire pour effectuer cette action",
166
     *   503="Service temporairement indisponible ou en maintenance",
167
     *  },
168
     *  section="Général"
169
     * )
170
     * @Route("/ping", name="ping")
171
     * @Method({"HEAD", "GET"})
172
     */
173
    public function pingAction()
174
    {
175
        return $this->json(null, 204);
176
    }
177
178
    /**
179
     * @ApiDoc(
180
     *  description="Recherche au travers de tout le site",
181
     *  requirements={
182
     *   {
183
     *    "name"="search",
184
     *    "dataType"="string",
185
     *    "description"="Le critère de recherche"
186
     *   }
187
     *  },
188
     *  statusCodes={
189
     *   200="Requête traitée avec succès",
190
     *   400="La syntaxe de la requête est erronée",
191
     *   401="Une authentification est nécessaire pour effectuer cette action",
192
     *   403="Pas les droits suffisants pour effectuer cette action",
193
     *   503="Service temporairement indisponible ou en maintenance",
194
     *  },
195
     *  section="Général"
196
     * )
197
     * @Route("/search")
198
     * @Method("POST")
199
     */
200
    public function searchAction(Request $request)
201
    {
202
        $this->trust($this->is('USER'));
203
204
        if (!$request->request->has('search')) {
205
            throw new BadRequestHttpException('Critère de recherche manquant');
206
        }
207
        $search = $request->request->get('search');
208
        $searchService = $this->get('ki_core.service.search');
209
        list($category, $criteria) = $searchService->analyzeRequest($search);
210
211
        return $this->json($searchService->search($category, $criteria));
212
    }
213
214
    /**
215
     * @ApiDoc(
216
     *  description="Retourne la version de uPont",
217
     *  statusCodes={
218
     *   200="Requête traitée avec succès",
219
     *   503="Service temporairement indisponible ou en maintenance",
220
     *  },
221
     *  section="Général"
222
     * )
223
     * @Route("/version")
224
     * @Method("GET")
225
     */
226
    public function versionAction()
227
    {
228
        return $this->json($this->get('ki_core.service.version')->getVersion());
229
    }
230
231
    /**
232
     * @ApiDoc(
233
     *  description="Retourne la configuration de uPont",
234
     *  statusCodes={
235
     *   200="Requête traitée avec succès",
236
     *   503="Service temporairement indisponible ou en maintenance",
237
     *  },
238
     *  section="Général"
239
     * )
240
     * @Route("/config")
241
     * @Method("GET")
242
     */
243
    public function configAction(Request $request)
244
    {
245
        return $this->json(array_merge([
246
            'ip' => $request->getClientIp(),
247
            'studentNetwork' => IpUtils::checkIp($request->getClientIp(), [
248
//                '127.0.0.1',
249
                '172.24.0.0/24',
250
                '172.24.20.0/22',
251
                '172.24.24.0/21',
252
                '172.24.32.0/20',
253
                '172.24.48.0/21',
254
                '172.24.56.0/22',
255
                '172.24.60.0/24',
256
                '172.24.100.0/22',
257
                '172.24.104.0/21',
258
                '172.24.112.0/20',
259
                '172.24.128.0/18',
260
                '172.24.192.0/21',
261
                '172.24.200.0/24',
262
                '195.221.194.14',
263
                '195.221.194.42',
264
                '195.221.194.43',
265
            ])
266
        ], $this->container->getParameter('upont')));
267
    }
268
}
269