Backbone REST-aanvraag om gebruikers aan project toe te voegen?

Ik ontwerp een toepassing volgens de REST-specificatie, maar ik weet niet zeker hoe ik het volgende moet structureren.

Ik heb projecten die het standaard CRUD-proces volgen. Ik heb ook gebruikers die ook een standaard CRUD-proces volgen. Ik heb echter een bewerking om gebruikers aan een project toe te voegen en ik weet niet zeker hoe ik het verzoek moet indienen.

Een gebruiker kan meerdere projecten hebben, dus ik denk dat het een soort van PUT-verzoek moet zijn, maar het project-ID maakt niet echt deel uit van het gebruikersmodel.

PUT /users/project/3

Eventuele suggesties over hoe dit te benaderen?

1

2 antwoord

Het klinkt alsof de gebruiker veel projecten kan hebben en een project veel gebruikers kan hebben. In dat geval kunt u het beste deze relatie beheren via een join-tabel, zodat u zoiets als deelnemers kunt noemen die een user_id en een project_id hebben.

Vervolgens kunt u kiezen of u deelnemers wilt beheren via een gebruiker of via een project. Voor mij is het logisch om je Projectdeelnemers te beheren, en omdat je een nieuwe deelnemer creëert, is het een POST.

POST /projects/:project_id/participants

De payload zou de user_id bevatten.

2
toegevoegd
oke, ik denk dat dit het stuk is dat ik miste, dat de associatie zelf tussen projecten/gebruikers een POST-verzoek is op zich. Ik zal mijn REST handler moeten aanpassen in codeigniter maar dit zal een hoop problemen voor mij oplossen, standaard voor een POST/projecten aanroep ik heb een index_post() functie in de projectcontroller kan ik nu ook een user_post() -handler hebben, wat heel logisch is vanuit het oogpunt van een ontwerp en me zelfs een gebruikerscontroller met een project_post() handler als ik dat wilde.
toegevoegd de auteur Rob, de bron

Als project-ID geen deel uitmaakt van het gebruikersmodel, betekent dit dat een reeks gebruikers-ID's deel uitmaakt van het projectmodel ... toch? Dus ik denk dat dit geschikt zou zijn om een ​​gebruiker aan een project toe te voegen:

PUT /projects/(projectid)/users/(userid)

Misschien hoeft u deze URL's echter niet te ondersteunen als ze niet nodig zijn voor de gebruikers van de service (bijv. Backbone); misschien wilt u gewoon een enkel eindpunt om projecten bij te werken:

PUT /projects/(projectid)

en uw Ajax-oproep zou een lijst met gebruikers bevatten als onderdeel van het verzoek om dit project bij te werken.

Mogelijk wilt u de vorm van de URL van Backbone gebruiken, afhankelijk van de gebruikersinterface. De eerste vorm van de URL is eigenlijk alleen nuttig voor verzoeken zoals "voeg gebruiker x toe aan project y" (bijvoorbeeld wanneer een beheerder klikt op "deze gebruiker aan het huidige project toevoegen" of wat dan ook).

De tweede vorm van de URL is wat u zou kunnen gebruiken voor het bijwerken van een projectgroothandel, die de lijst met gebruikers, de naam van het project, enz. Zou kunnen omvatten; dat is de weergave "bewerkingsproject".

var ProjectModel = Backbone.Model.extend({
    defaults: {
        "project_name": "",
        "users: [0]
    },

    urlRoot: "/myrestapi/projects",

    url: function() {
        return this.urlRoot + "/" + this.cid;
    }
});

Een Backbone save -verzoek voor dit model zou een (POST? PUT?) Naar de URL activeren:

/myrestapi/projects/(cid)

Met de postgegevens die de modustatus van het project weergeven:

{ "project_name": "foo", "users": [15, 18, 42] }

Het is dan aan uw REST-service om de updates in de gegevensopslag van uw server te activeren ...

1
toegevoegd
@Rob Ik denk dat de PUT -functie verschillende logica kan hebben, afhankelijk van de URL; het hangt er echt van af of u een volledige REST API wilt ondersteunen, of alleen die URL's die echt nodig zijn door de Backbone-applicatie. Zie mijn update voor een voorbeeld.
toegevoegd de auteur McGarnagle, de bron
Van Backbone kun je het op verschillende manieren structureren; u zou een afzonderlijk model users_projects kunnen hebben dat overeenkomt met een vergelijkbare many-to-many-tabel in uw database. Je zou je kunnen verleiden en een genest model gebruiken in het gebruiker model. Of je kunt het model gewoon overslaan en een onbewerkte Ajax POST/PUT terug naar je REST-service brengen.
toegevoegd de auteur McGarnagle, de bron
oké, dat is logisch, maar hier raak ik een beetje in de war. Als ik al put/projects/(projectid) gebruik om projectkenmerken bij te werken, lijkt dit een apart proces voor mij. Of betekent dit dat mijn PUT-functie logica moet hebben voor verschillende gevallen op basis van hoe de URL wordt gevormd of welke parameters deze ontvangt?
toegevoegd de auteur Rob, de bron
Ook, hoe zou ik dit type verzoek verzenden met backbone.js? Ik ben hier niet echt de gebruikers- of projectmodellen aan het updaten. Als er iets is, heb ik een project met een lijst met gebruikers, dus het is meer een POST-aanvraag voor een gebruiker, omdat ik die gebruiker aan de verzameling moet toevoegen - het enige ding is dat de gebruiker al bestaat in db, ze worden gewoon toegevoegd aan de project.
toegevoegd de auteur Rob, de bron