J. Carpeta « srv »

Versión para imprimir.

A. srv / amigo-agrega.php

1<?php
2
3require_once __DIR__ . "/../lib/php/ejecutaServicio.php";
4require_once __DIR__ . "/../lib/php/recuperaTexto.php";
5require_once __DIR__ . "/../lib/php/recuperaEntero.php";
6require_once __DIR__ . "/../lib/php/validaNombre.php";
7require_once __DIR__ . "/../lib/php/insert.php";
8require_once __DIR__ . "/../lib/php/devuelveCreated.php";
9require_once __DIR__ . "/Bd.php";
10require_once __DIR__ . "/TABLA_AMIGO.php";
11require_once __DIR__ . "/TABLA_PASATIEMPO.php";
12require_once __DIR__ . "/validaPasId.php";
13
14ejecutaServicio(function () {
15
16 $nombre = recuperaTexto("nombre");
17 $pasId = recuperaEntero("pasId");
18
19 $nombre = validaNombre($nombre);
20 $pasId = validaPasId($pasId);
21
22 $pdo = Bd::pdo();
23 insert(
24 pdo: $pdo,
25 into: AMIGO,
26 values: [AMI_NOMBRE => $nombre, PAS_ID => $pasId]
27 );
28 $id = $pdo->lastInsertId();
29
30 $encodeId = urlencode($id);
31
32 devuelveCreated("/srv/amigo.php?id=$encodeId", [
33 "id" => ["value" => $id],
34 "nombre" => ["value" => $nombre],
35 "pasId" => ["value" => $pasId === null ? "" : $pasId]
36 ]);
37});
38

B. srv / amigo-elimina.php

1<?php
2
3require_once __DIR__ . "/../lib/php/ejecutaServicio.php";
4require_once __DIR__ . "/../lib/php/recuperaIdEntero.php";
5require_once __DIR__ . "/../lib/php/delete.php";
6require_once __DIR__ . "/../lib/php/devuelveNoContent.php";
7require_once __DIR__ . "/Bd.php";
8require_once __DIR__ . "/TABLA_AMIGO.php";
9
10ejecutaServicio(function() {
11 $id = recuperaIdEntero("id");
12 delete(pdo: Bd::pdo(), from: AMIGO, where: [AMI_ID => $id]);
13 devuelveNoContent();
14});
15

C. srv / amigo-modifica.php

1<?php
2
3require_once __DIR__ . "/../lib/php/ejecutaServicio.php";
4require_once __DIR__ . "/../lib/php/recuperaIdEntero.php";
5require_once __DIR__ . "/../lib/php/recuperaTexto.php";
6require_once __DIR__ . "/../lib/php/recuperaEntero.php";
7require_once __DIR__ . "/../lib/php/validaNombre.php";
8require_once __DIR__ . "/../lib/php/update.php";
9require_once __DIR__ . "/../lib/php/devuelveJson.php";
10require_once __DIR__ . "/Bd.php";
11require_once __DIR__ . "/TABLA_AMIGO.php";
12require_once __DIR__ . "/TABLA_PASATIEMPO.php";
13require_once __DIR__ . "/validaPasId.php";
14
15ejecutaServicio(function () {
16
17 $id = recuperaIdEntero("id");
18 $nombre = recuperaTexto("nombre");
19 $pasId = recuperaEntero("pasId");
20
21 $nombre = validaNombre($nombre);
22 $pasId = validaPasId($pasId);
23
24 update(
25 pdo: Bd::pdo(),
26 table: AMIGO,
27 set: [AMI_NOMBRE => $nombre, PAS_ID => $pasId],
28 where: [AMI_ID => $id]
29 );
30
31 devuelveJson([
32 "id" => ["value" => $id],
33 "nombre" => ["value" => $nombre],
34 "pasId" => ["value" => $pasId === null ? "" : $pasId]
35 ]);
36});
37

D. srv / amigo.php

1<?php
2
3require_once __DIR__ . "/../lib/php/NOT_FOUND.php";
4require_once __DIR__ . "/../lib/php/ejecutaServicio.php";
5require_once __DIR__ . "/../lib/php/recuperaIdEntero.php";
6require_once __DIR__ . "/../lib/php/selectFirst.php";
7require_once __DIR__ . "/../lib/php/devuelveJson.php";
8require_once __DIR__ . "/../lib/php/ProblemDetails.php";
9require_once __DIR__ . "/Bd.php";
10require_once __DIR__ . "/TABLA_AMIGO.php";
11require_once __DIR__ . "/TABLA_PASATIEMPO.php";
12
13ejecutaServicio(function () {
14
15 $amiId = recuperaIdEntero("id");
16
17 $modelo = selectFirst(pdo: Bd::pdo(), from: AMIGO, where: [AMI_ID => $amiId]);
18
19 if ($modelo === false) {
20 $amiIdHtml = htmlentities($amiId);
21 throw new ProblemDetails(
22 status: NOT_FOUND,
23 title: "Amigo no encontrado.",
24 type: "/error/amigonoencontrado.html",
25 detail: "No se encontró ningún amigo con el id $amiIdHtml.",
26 );
27 }
28
29 devuelveJson([
30 "id" => ["value" => $amiId],
31 "nombre" => ["value" => $modelo[AMI_NOMBRE]],
32 "pasId" => ["value" => $modelo[PAS_ID] === null ? "" : $modelo[PAS_ID]]
33 ]);
34});
35

E. srv / amigos.php

1<?php
2
3require_once __DIR__ . "/../lib/php/ejecutaServicio.php";
4require_once __DIR__ . "/../lib/php/fetchAll.php";
5require_once __DIR__ . "/../lib/php/devuelveJson.php";
6require_once __DIR__ . "/Bd.php";
7require_once __DIR__ . "/TABLA_AMIGO.php";
8require_once __DIR__ . "/TABLA_PASATIEMPO.php";
9
10ejecutaServicio(function () {
11
12 $lista = fetchAll(Bd::pdo()->query(
13 "SELECT
14 A.AMI_ID,
15 A.AMI_NOMBRE,
16 P.PAS_NOMBRE
17 FROM AMIGO A
18 LEFT JOIN PASATIEMPO P
19 ON A.PAS_ID = P.PAS_ID
20 ORDER BY A.AMI_NOMBRE"
21 ));
22
23 $render = "";
24 foreach ($lista as $modelo) {
25 $encodeAmiId = urlencode($modelo[AMI_ID]);
26 $amiId = htmlentities($encodeAmiId);
27 $amiNombre = htmlentities($modelo[AMI_NOMBRE]);
28 $pasNombre = $modelo[PAS_NOMBRE] === null
29 ? "<em>-- Sin pasatiempo --</em>"
30 : htmlentities($modelo[PAS_NOMBRE]);
31 $render .=
32 "<dt><a href='modifica.html?id=$amiId'>$amiNombre</a></dt>
33 <dd><a href='modifica.html?id=$amiId'>$pasNombre</a></dd>";
34 }
35
36 devuelveJson(["lista" => ["innerHTML" => $render]]);
37});
38

F. srv / Bd.php

1<?php
2
3class Bd
4{
5 private static ?PDO $pdo = null;
6
7 static function pdo(): PDO
8 {
9 if (self::$pdo === null) {
10
11 self::$pdo = new PDO(
12 // cadena de conexión
13 "sqlite:srvauno.db",
14 // usuario
15 null,
16 // contraseña
17 null,
18 // Opciones: pdos no persistentes y lanza excepciones.
19 [PDO::ATTR_PERSISTENT => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
20 );
21
22 self::$pdo->exec(
23 'CREATE TABLE IF NOT EXISTS PASATIEMPO (
24 PAS_ID INTEGER,
25 PAS_NOMBRE TEXT NOT NULL,
26 CONSTRAINT PAS_PK
27 PRIMARY KEY(PAS_ID),
28 CONSTRAINT PAS_NOM_UNQ
29 UNIQUE(PAS_NOMBRE),
30 CONSTRAINT PAS_NOM_NV
31 CHECK(LENGTH(PAS_NOMBRE) > 0)
32 )'
33 );
34 self::$pdo->exec(
35 'CREATE TABLE IF NOT EXISTS AMIGO (
36 AMI_ID INTEGER,
37 AMI_NOMBRE TEXT NOT NULL,
38 PAS_ID INTEGER,
39 CONSTRAINT AMI_PK
40 PRIMARY KEY(AMI_ID),
41 CONSTRAINT AMI_NOM_UNQ
42 UNIQUE(AMI_NOMBRE),
43 CONSTRAINT AMI_NOM_NV
44 CHECK(LENGTH(AMI_NOMBRE) > 0),
45 CONSTRAINT AMI_PAS_FK
46 FOREIGN KEY (PAS_ID) REFERENCES PASATIEMPO(PAS_ID)
47 )'
48 );
49
50 $cantidadDePasatiempos =
51 self::$pdo->query("SELECT COUNT(PAS_ID) FROM PASATIEMPO")->fetchColumn();
52
53 if ($cantidadDePasatiempos === 0) {
54 self::$pdo->exec(
55 "INSERT INTO PASATIEMPO (PAS_NOMBRE) VALUES ('Futbol'), ('Videojuegos')"
56 );
57 }
58 }
59
60 return self::$pdo;
61 }
62}
63

G. srv / pasatiempo-options.php

1<?php
2
3require_once __DIR__ . "/../lib/php/ejecutaServicio.php";
4require_once __DIR__ . "/../lib/php/select.php";
5require_once __DIR__ . "/../lib/php/devuelveJson.php";
6require_once __DIR__ . "/Bd.php";
7require_once __DIR__ . "/TABLA_PASATIEMPO.php";
8
9ejecutaServicio(function () {
10
11 $lista = select(pdo: Bd::pdo(), from: PASATIEMPO, orderBy: PAS_NOMBRE);
12
13 $render = "<option value=''>-- Sin pasatiempo --</option>";
14 foreach ($lista as $modelo) {
15 $id = htmlentities($modelo[PAS_ID]);
16 $nombre = htmlentities($modelo[PAS_NOMBRE]);
17 $render .= "<option value='$id'>{$nombre}</option>";
18 }
19
20 devuelveJson(["pasId" => ["innerHTML" => $render]]);
21});
22

H. srv / TABLA_AMIGO.php

1<?php
2
3const AMIGO = "AMIGO";
4const AMI_ID = "AMI_ID";
5const AMI_NOMBRE = "AMI_NOMBRE";
6

I. srv / TABLA_PASATIEMPO.php

1<?php
2
3const PASATIEMPO = "PASATIEMPO";
4const PAS_ID = "PAS_ID";
5const PAS_NOMBRE = "PAS_NOMBRE";
6

J. srv / validaPasId.php

1<?php
2
3require_once __DIR__ . "/../lib/php/BAD_REQUEST.php";
4require_once __DIR__ . "/../lib/php/ProblemDetails.php";
5
6function validaPasId(false|null|int $pasId)
7{
8
9 if ($pasId === false)
10 throw new ProblemDetails(
11 status: BAD_REQUEST,
12 title: "Falta pasId.",
13 type: "/error/faltapasid.html",
14 detail: "La solicitud no tiene el valor de pasId."
15 );
16
17 return $pasId;
18}
19