Bonjour!

Je dois mettre en place une API JSON-RPC (en nodeJS si ca joue) qui devra gérer une DB (select, insert, update, delete).
J'ai déjà commencé à faire un Reposiroty Pattern : une classe JS par table.
Sauf que je me suis rendue compte que dans deux repos j'ai besoin de mettre en place une business-logic multi-entités (ces repos ont besoin d'utiliser d'en utiliser d'autres).


En cherchant un peu j'ai trouver 2 moyens de faire ça :
  • mettre ces méthodes dans le repos concerné
  • mettre ces méthodes dans un "SuperRepos" qui utilise les autres


Comment savoir le quel choisir ?
Le problème c'est que je ne comprend pas ce que sont des méthodes "high-level" et "low-level".

Exemple avec mon cas
Ma DB peut-être séparée en deux "parties" dans le sens où il y a deux tables "principales" et les autres tables ont une FK vers une de ces tables.
Rassurez-vous ces deux parties sont quand même liées à un endroit .

En ce qui concerne la business-logic multi-entités : insérer dans une des tables principales nécessite l'insertion dans certaines autres (pas toutes!), donc faire une transaction.

Par exemple :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
-- Partie un
CREATE TABLE foo(
	fooId PRIMARY KEY,
	createdAt timestamp with time zone NOT NULL DEFAULT CURRENT_DATE,
  updatedAt timestamp with time zone,
	uuid text NOT NULL,
	autresChamps [...]
)
 
CREATE TABLE bar(
	barId PRIMARY KEY,
	fooId integer REFERENCES foo(fooId),
	infoOne text NOT NULL,
	autresChamps [...]
)
 
CREATE TABLE baz(
	bazId PRIMARY KEY,
	fooId integer REFERENCES foo(fooId),
	name text NOT NULL,
	infoTwo boolean DEFAULT FALSE,
	autresChamps [...]
)
-- other related table
 
-- Partie deux
CREATE TABLE qux(
	quxId PRIMARY KEY,
	createdAt timestamp with time zone NOT NULL DEFAULT CURRENT_DATE,
  updatedAt timestamp with time zone,
	name test NOT NULL,
	infoOne boolean DEFAULT FALSE,
	autresChamps [...]
)
 
CREATE TABLE fum(
	fumId PRIMARY KEY,
	quxId integer REFERENCES qux(quxId),
	infoOne text NOT NULL,
	autresChamps [...],
)
 
-- other related table
 
-- lien entre les deux "parties"
CREATE TABLE linked(
	fooId integer REFERENCES foo(fooId),
	quxId integer REFERENCES qux(quxId),
	autresChamps [...],
	PRIMARY KEY (fooId, quxId)
)


Repo :

Code JAVASCRIPT : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class fooRepository {
	constructor(db) { this.Database = db; } // connexion à la DB gérer par une librairie
 
	update(foo) { /* modifie les valeur d'un enregistrement, hidden for brevity */ }
 
	async insert(foo) { /* insert simplement une ligne dans "foo" */ }
 
	insertFull(obj) {
		return this.Database.transaction('tag', async t => {
			// this = t = context de la transaction de la librairie,
			// ce contexte est un circular Object et il contient tous les repo (dont fooRepository)
			let res = {};
			const res.foo = await t.fooRepository.insert(obj.foo);
			obj.fooId = res.foo.fooId;
 
			res.bar = await t.barRepository.insert(obj.bar);
			res.baz = await t.bazRepository.insert(obj.baz);
		})
	}
}


Ci dessus : insertion dans foo = insertion dans bar et baz ou rien.