Puedes crear una base de datos en Postgres asociada a una API de forma que quede aislada del resto de bases de datos de otras APIs.
Para crear una base de datos añade estos endpoints a tu API:
delete /database:
Drop:
directive: DatabaseDrop
post /database:
Create:
directive: DatabaseCreate
Connect:
directive: DatabaseConnect
Migrate:
directive: DatabaseMigrate
files: "Assets/db/"
post /database/migrate:
Connect:
directive: DatabaseConnect
Migrate:
directive: DatabaseMigrate
files: "Assets/db/"
Mediante el endpoint delete podrás borrar tu base de datos.
Mediante el endpoint post /database, se creará la base de datos y se ejecutarán todas las migraciones.
Mediante el endpoint post /database/migrate, se ejecutarán todas las migraciones no ejecutadas previamente de una base de datos que ya fue creada en el pasado.
Las migraciones son ficheros sql alojados en Assets/sql, que tendrán estos nombres:
001_create_table_users.sql
002_create_table_companies.sql
003_create_index_name_to_users.sql
Primero se ejecutará la 001, luego la 002, etc.
Los ficheros contendrán sintaxis SQL de postgres, por ejemplo 001_create_table_users.sql podría contener:
CREATE TABLE users (
id VARCHAR ( 120 ) PRIMARY KEY,
name VARCHAR ( 120 ) NOT NULL,
created_at TIMESTAMP NOT NULL
);
Puedes habilitar la extensión PostGIS ejecutando la siguiente sentencia SQL:
CREATE EXTENSION postgis;
Una vez has creado tu base de datos y tus tablas, puedes conectarte en cualquier endpoint con la directiva DatabaseConnect, por ejemplo:
post /user:
LoadUser:
directive: LoadAndValidateModel
source: $.message.bodyAsArray
target: user
Connect:
directive: DatabaseConnect
SaveUser:
directive: SaveUser
user: $.memory.user
Este endpoint recibe un JSON con un usuario, lo valida, se conecta a la base de datos de la API mediante DatabaseConnect y almacena el usuario mediante SaveUser. SaveUser es una directiva que habría que desarrollar, y que podría tener esta forma:
$db = $state->memory()->get('db-conn');
$user = $config['user'];
$sth = $db->prepare('SELECT id FROM users WHERE name = ?');
$sth->execute([$user['name']]);
$data = $sth->fetchObject();
if (isset($data->id)) {
return;
}
$sth = $db->prepare(
'INSERT INTO users (
name,
created_at )
VALUES( ? ,NOW() )'
);
$sth->execute([
$user['name']
]);
Una vez realizada la conexión a base de datos con DatabaseConnect, se almacena en memory dicha conexión para que la puedas utilizar desde cualquier directiva. Puedes recuperarla con: $state->memory()->get('db-conn').
La conexión recuperada, es una conexión PDO de php, por lo que podrás utilizar todos los métodos de PDO, tal como se muestra en el ejemplo anterior.