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.