Quindi supponiamo di avere tre semplici risorse: gruppi, utenti e utenti di gruppo.
Groups - Represent interest groups which can be subscribed by users.
{
name: 'Colorado Mountain Biking Group'
ownerId: 1 (Some user)
}
GroupUsers - Represents the junction table in the many to many Groups - Users relationship. Group membership status and some other attributes are stored here.
{
userId: 2,
courseId: 1,
color: '#FFFFFF',
nickname: 'MBG Colorado',
status: 'accepted'
}
Poiché il nostro client API gestirà sempre il gruppo dalla prospettiva dell'utente autenticato, GET /api/groups/1 AUTH(userId=2)
dovrebbe restituire:
Group (Includes GroupUser for authenticated user)
{
id: 1
name: 'Colorado Mountain Biking Group'
ownerId: 1,
groupUser: {
userId: 2,
courseId: 1,
color: '#FFFFFF',
nickname: 'MBG Colorado',
status: 'accepted'
}
}
Qualcuno mi ha suggerito che i nostri client API non dovrebbero conoscere o preoccuparsi della tabella di giunzione, tutto quello che dovrebbero interessare è il gruppo, quindi dovrei rispondere con una risorsa unita in questo modo:
group (In reality group merged with groupUsers for the authenticated user.)
{
id: 1
name: 'Colorado Mountain Biking Group'
ownerId: 1,
userId: 2,
color: '#FFFFFF',
nickname: 'MBG Colorado',
status: 'accepted'
}
Il problema che vedo con questo (oltre a unire problemi come ID ripetuto e timestamp creati / aggiornati / ora) è che i client API utilizzeranno la stessa risorsa per interagire ulteriormente con i nostri endpoint API.
Se un client API desidera aggiornare la risorsa groupUser, vorrebbe:
PUT /api/groups/1
{
id: 1
name: 'Colorado Mountain Biking Group'
ownerId: 1,
userId: 2,
color: '#000000',
nickname: 'Some other value',
status: 'accepted'
}
Così ora avremmo anche bisogno di scansionare i corpi delle richieste e differenziare gli attributi group e groupUser. Ne vale la pena? Anche quando i consumatori di API sono altri sviluppatori interni?