O. Carpeta « api »

Versión para imprimir.

A. api / Bd.php

1
<?php
2
3
require_once __DIR__ . "/ROL_ID_CLIENTE.php";
4
require_once __DIR__ . "/ROL_ID_ADMINISTRADOR.php";
5
require_once __DIR__ . "/../libservidorphp/rolBusca.php";
6
require_once __DIR__ . "/../libservidorphp/rolAgrega.php";
7
require_once __DIR__ . "/../libservidorphp/usuRolAgrega.php";
8
require_once __DIR__ . "/usuarioBuscaSan.php";
9
10
class Bd
11
{
12
13
 private static ?PDO $pdo = null;
14
15
 static function pdo(): PDO
16
 {
17
  if (self::$pdo === null) {
18
19
   self::$pdo = new PDO(
20
    // cadena de conexión
21
    "sqlite:" . __DIR__ . "/srvaut.db",
22
    // usuario
23
    null,
24
    // contraseña
25
    null,
26
    // Opciones: pdos no persistentes y lanza excepciones.
27
    [PDO::ATTR_PERSISTENT => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
28
   );
29
30
   self::$pdo->exec(
31
    'CREATE TABLE IF NOT EXISTS USUARIO (
32
      USU_ID INTEGER,
33
      USU_SAN TEXT NOT NULL,
34
      USU_SEN TEXT NOT NULL,
35
      CONSTRAINT USU_PK
36
       PRIMARY KEY(USU_ID),
37
      CONSTRAINT USU_SAN_UNQ
38
       UNIQUE(USU_SAN),
39
      CONSTRAINT USU_SAN_NV
40
       CHECK(LENGTH(USU_SAN) > 0)
41
     )'
42
   );
43
   self::$pdo->exec(
44
    'CREATE TABLE IF NOT EXISTS ROL (
45
      ROL_ID TEXT NOT NULL,
46
      ROL_DESCRIPCION TEXT NOT NULL,
47
      CONSTRAINT ROL_PK
48
       PRIMARY KEY(ROL_ID),
49
      CONSTRAINT ROL_ID_NV
50
       CHECK(LENGTH(ROL_ID) > 0),
51
      CONSTRAINT ROL_DESCR_UNQ
52
       UNIQUE(ROL_DESCRIPCION),
53
      CONSTRAINT ROL_DESCR_NV
54
       CHECK(LENGTH(ROL_DESCRIPCION) > 0)
55
     )'
56
   );
57
   self::$pdo->exec(
58
    'CREATE TABLE IF NOT EXISTS USU_ROL (
59
       USU_ID INTEGER NOT NULL,
60
       ROL_ID TEXT NOT NULL,
61
       CONSTRAINT USU_ROL_PK
62
        PRIMARY KEY(USU_ID, ROL_ID),
63
       CONSTRAINT USU_ROL_USU_FK
64
        FOREIGN KEY (USU_ID) REFERENCES USUARIO(USU_ID),
65
       CONSTRAINT USU_ROL_ROL_FK
66
        FOREIGN KEY (ROL_ID) REFERENCES ROL(ROL_ID)
67
      )'
68
   );
69
70
   self::$pdo->beginTransaction();
71
72
   if (rolBusca(self::$pdo, "Administrador") === false) {
73
    rolAgrega(
74
     bd: self::$pdo,
75
     id: "Administrador",
76
     descripcion: "Administra el sistema."
77
    );
78
   }
79
80
   if (rolBusca(self::$pdo, "Cliente") === false) {
81
    rolAgrega(
82
     bd: self::$pdo,
83
     id: "Cliente",
84
     descripcion: "Realiza compras."
85
    );
86
   }
87
88
   $usuarioAgrega = self::$pdo->prepare(
89
    "INSERT INTO USUARIO (
90
      USU_SAN, USU_SEN
91
     ) VALUES (
92
      :USU_SAN, :USU_SEN
93
     )"
94
   );
95
96
   if (usuarioBuscaSan(self::$pdo, "pepito") === false) {
97
    $usuarioAgrega->execute([
98
     ":USU_SAN" => "pepito",
99
     ":USU_SEN" => password_hash("cuentos", PASSWORD_DEFAULT),
100
    ]);
101
    $usuId = self::$pdo->lastInsertId();
102
    usuRolAgrega(self::$pdo, $usuId, [ROL_ID_CLIENTE]);
103
   }
104
105
   if (usuarioBuscaSan(self::$pdo, "susana") === false) {
106
    $usuarioAgrega->execute([
107
     ":USU_SAN" => "susana",
108
     ":USU_SEN" => password_hash("alegria", PASSWORD_DEFAULT),
109
    ]);
110
    $usuId = self::$pdo->lastInsertId();
111
    usuRolAgrega(self::$pdo, $usuId, [ROL_ID_ADMINISTRADOR]);
112
   }
113
114
   if (usuarioBuscaSan(self::$pdo, "bebe") === false) {
115
    $usuarioAgrega->execute([
116
     ":USU_SAN" => "bebe",
117
     ":USU_SEN" => password_hash("saurio", PASSWORD_DEFAULT),
118
    ]);
119
    $usuId = self::$pdo->lastInsertId();
120
    usuRolAgrega(self::$pdo, $usuId, [ROL_ID_CLIENTE,ROL_ID_ADMINISTRADOR]);
121
   }
122
123
   self::$pdo->commit();
124
  }
125
126
  return self::$pdo;
127
 }
128
}
129

B. api / jsonMiNav.php

1
<?php
2
3
function jsonMiNav(string $san, array $rolIds)
4
{
5
 $json = [
6
  "ocupado" => ["hidden" => true],
7
  "aAdmin" => [
8
   "hidden" => array_search(ROL_ID_ADMINISTRADOR, $rolIds, true) === false
9
  ],
10
  "aCliente" => [
11
   "hidden" => array_search(ROL_ID_CLIENTE, $rolIds, true) === false
12
  ],
13
  "san" => ["hidden" => $san === "", "textContent" => $san],
14
 ];
15
16
 return $json;
17
}
18

C. api / login.php

1
<?php
2
3
require_once __DIR__ . "/../libservidorphp/manejaErrores.php";
4
require_once __DIR__ . "/../libservidorphp/BAD_REQUEST.php";
5
require_once __DIR__ . "/../libservidorphp/recibeTextoObligatorio.php";
6
require_once __DIR__ . "/../libservidorphp/recibeTexto.php";
7
require_once __DIR__ . "/../libservidorphp/devuelveJson.php";
8
require_once __DIR__ . "/../libservidorphp/rolIdsParaUsuId.php";
9
require_once __DIR__ . "/SAN.php";
10
require_once __DIR__ . "/USU_ID.php";
11
require_once __DIR__ . "/ROL_IDS.php";
12
require_once __DIR__ . "/Bd.php";
13
require_once __DIR__ . "/protegeLogin.php";
14
require_once __DIR__ . "/usuarioBuscaSan.php";
15
16
protegeLogin([]);
17
18
$san = recibeTextoObligatorio("san");
19
$sen = recibeTexto("sen");
20
21
$bd = Bd::pdo();
22
23
$usuario = usuarioBuscaSan($bd, $san);
24
25
if (
26
 $usuario === false
27
 || !password_verify(
28
  ($sen === false || $sen === null) ? "" : $sen,
29
  $usuario["USU_SEN"]
30
 )
31
)
32
 throw new ProblemDetailsException([
33
  "status" => BAD_REQUEST,
34
  "type" => "/errors/datosincorrectos.html",
35
  "title" => "Datos incorrectos.",
36
  "detail" => "El san y/o el sen proporcionados son incorrectos.",
37
 ]);
38
39
$_SESSION[SAN] = $san;
40
$_SESSION[USU_ID] = $usuario[USU_ID];
41
42
devuelveJson([
43
 SAN => $san,
44
 ROL_IDS => rolIdsParaUsuId($bd, $usuario[USU_ID])
45
]);
46

D. api / logout.php

1
<?php
2
3
require_once __DIR__ . "/../libservidorphp/manejaErrores.php";
4
require_once __DIR__ . "/../libservidorphp/devuelveNoContent.php";
5
require_once __DIR__ . "/SAN.php";
6
require_once __DIR__ . "/ROL_IDS.php";
7
8
session_start();
9
10
if (isset($_SESSION[SAN])) {
11
 unset($_SESSION[SAN]);
12
}
13
if (isset($_SESSION[ROL_IDS])) {
14
 unset($_SESSION[ROL_IDS]);
15
}
16
17
session_destroy();
18
19
devuelveNoContent();
20

E. api / protege.php

1
<?php
2
3
require_once __DIR__ . "/../libservidorphp/NO_AUTORIZADO.php";
4
require_once __DIR__ . "/../libservidorphp/PROHIBIDO.php";
5
require_once __DIR__ . "/../libservidorphp/ProblemDetailsException.php";
6
require_once __DIR__ . "/../libservidorphp/rolIdsParaUsuId.php";
7
require_once __DIR__ . "/SAN.php";
8
require_once __DIR__ . "/USU_ID.php";
9
require_once __DIR__ . "/Bd.php";
10
11
function protege(array $rolIdsPermitidos)
12
{
13
14
 session_start();
15
16
 $san = isset($_SESSION[SAN]) ? $_SESSION[SAN] : "";
17
 $usuId = isset($_SESSION[USU_ID]) ? $_SESSION[USU_ID] : -1;
18
 $rolIds = rolIdsParaUsuId(Bd::pdo(), $usuId);
19
20
 if (count($rolIdsPermitidos) === 0) {
21
22
  return [$san, $rolIds, $usuId];
23
 } else {
24
25
  if ($san === "")
26
   throw new ProblemDetailsException([
27
    "status" => NO_AUTORIZADO,
28
    "type" => "/errors/noautorizado.html",
29
    "title" => "No autorizado.",
30
    "detail" => "Necesitas iniciar sesión.",
31
   ]);
32
33
  foreach ($rolIdsPermitidos as $rolId) {
34
   if (array_search($rolId, $rolIds, true) !== false) {
35
    return [$san, $rolIds, $usuId];
36
   }
37
  }
38
39
  throw new ProblemDetailsException([
40
   "status" => PROHIBIDO,
41
   "type" => "/errors/prohibido.html",
42
   "title" => "Prohibido.",
43
   "detail" => "No tienes roles para usar este recurso.",
44
  ]);
45
 }
46
}
47

F. api / protegeLogin.php

1
<?php
2
3
require_once __DIR__ . "/../libservidorphp/PROHIBIDO.php";
4
require_once __DIR__ . "/../libservidorphp/ProblemDetailsException.php";
5
require_once __DIR__ . "/protege.php";
6
7
function protegeLogin(array $rolIdsPermitidos)
8
{
9
10
 list($san, $rolIds, $usuId) = protege($rolIdsPermitidos);
11
12
 if ($san !== "")
13
  throw new ProblemDetailsException([
14
   "status" => PROHIBIDO,
15
   "type" => "/errors/sesioniniciada.html",
16
   "title" => "Sesión iniciada.",
17
   "detail" => "La sesión ya está iniciada.",
18
  ]);
19
20
 return [$san, $rolIds, $usuId];
21
}
22

G. api / ROL_IDS.php

1
<?php
2
3
const ROL_IDS = "rolIds";

H. api / ROL_ID_ADMINISTRADOR.php

1
<?php
2
3
const ROL_ID_ADMINISTRADOR = "Administrador";
4

I. api / ROL_ID_CLIENTE.php

1
<?php
2
3
const ROL_ID_CLIENTE = "Cliente";

J. api / saludo-cliente.php

1
<?php
2
3
require_once __DIR__ . "/../libservidorphp/manejaErrores.php";
4
require_once __DIR__ . "/../libservidorphp/devuelveJson.php";
5
require_once __DIR__ . "/ROL_ID_CLIENTE.php";
6
require_once __DIR__ . "/protege.php";
7
8
list($san) = protege([ROL_ID_CLIENTE]);
9
10
devuelveJson("Hola $san.");
11

K. api / SAN.php

1
<?php
2
3
const SAN = "san";

L. api / usuarioBuscaSan.php

1
<?php
2
3
function usuarioBuscaSan(\PDO $bd, string $san)
4
{
5
 $usuarioBusca = $bd->prepare("SELECT * FROM USUARIO WHERE USU_SAN = :USU_SAN");
6
 $usuarioBusca->execute([":USU_SAN" => $san]);
7
 $usuario = $usuarioBusca->fetch(PDO::FETCH_ASSOC);
8
 return $usuario;
9
}
10

M. api / USU_ID.php

1
<?php
2
3
const USU_ID = "USU_ID";

N. api / vista-administrador.php

1
<?php
2
3
require_once __DIR__ . "/../libservidorphp/manejaErrores.php";
4
require_once __DIR__ . "/protege.php";
5
require_once __DIR__ . "/../libservidorphp/devuelveJson.php";
6
require_once __DIR__ . "/ROL_ID_ADMINISTRADOR.php";
7
require_once __DIR__ . "/jsonMiNav.php";
8
9
list($san, $rolIds) = protege([ROL_ID_ADMINISTRADOR]);
10
devuelveJson([
11
 ...jsonMiNav($san, $rolIds),
12
 "main" => ["hidden" => false],
13
]);
14

O. api / vista-cliente.php

1
<?php
2
3
require_once __DIR__ . "/../libservidorphp/manejaErrores.php";
4
require_once __DIR__ . "/protege.php";
5
require_once __DIR__ . "/../libservidorphp/devuelveJson.php";
6
require_once __DIR__ . "/ROL_ID_CLIENTE.php";
7
require_once __DIR__ . "/jsonMiNav.php";
8
9
list($san, $rolIds) = protege([ROL_ID_CLIENTE]);
10
11
devuelveJson([
12
 ...jsonMiNav($san, $rolIds),
13
 "main" => ["hidden" => false],
14
]);
15

P. api / vista-index.php

1
<?php
2
3
require_once __DIR__ . "/../libservidorphp/manejaErrores.php";
4
require_once __DIR__ . "/protege.php";
5
require_once __DIR__ . "/../libservidorphp/devuelveJson.php";
6
require_once __DIR__ . "/jsonMiNav.php";
7
8
list($san, $rolIds) = protege([]);
9
10
devuelveJson(jsonMiNav($san, $rolIds));
11

Q. api / vista-login.php

1
<?php
2
3
require_once __DIR__ . "/../libservidorphp/manejaErrores.php";
4
require_once __DIR__ . "/../libservidorphp/devuelveJson.php";
5
require_once __DIR__ . "/protegeLogin.php";
6
7
protegeLogin([]);
8
9
devuelveJson([
10
 "ocupado" => ["hidden" => true],
11
 "formulario" => ["hidden" =>  false],
12
]);
13

R. api / vista-perfil.php

1
<?php
2
3
require_once __DIR__ . "/../libservidorphp/manejaErrores.php";
4
require_once __DIR__ . "/protege.php";
5
require_once __DIR__ . "/../libservidorphp/devuelveJson.php";
6
require_once __DIR__ . "/jsonMiNav.php";
7
8
list($san, $rolIds) = protege([]);
9
10
if ($san === "") {
11
 devuelveJson([
12
  ...jsonMiNav($san, $rolIds),
13
  "login" => ["hidden" => false],
14
  "outputSan" => ["value" => "No has iniciado sesión."],
15
  "outputRoles" => ["value" => ""],
16
 ]);
17
} else {
18
 devuelveJson([
19
  ...jsonMiNav($san, $rolIds),
20
  "botonLogout" => ["hidden" => false],
21
  "outputSan" => ["value" => $san],
22
  "outputRoles" => [
23
   "value" => count($rolIds) === 0
24
    ? "Sin roles."
25
    : implode(", ", $rolIds),
26
  ],
27
 ]);
28
}
29