Detta är del av en artikelserie Guppy - Hur bygger man en riktig tjänst med Azure Mobile Services?
I Guppy har jag en tabell för användarna, User. I denna tabell finns ett fält som heter DisplayName. Där lagrar jag ett namn som användaren vill skall vara dess synliga namn i tjänsten. På klientsidan vill jag inte först kolla om en användare finns för att sedan använda metoden insert för att skapa en ny användare eller update för att uppdatera en befintlig. Jag vill istället alltid anropa insert och sedan får serversidan ta hand om detta.
Klientsidan ser inte något speciell ut:
public static async Task UpdateUserInformationAsync(IMobileServiceTable<User> userTable, User user) { var u = new User() { displayName = user.displayName }; await userTable.InsertAsync(u); }
userTable är egentligen följande App.MobileService.GetTable<User>(), som helt enkelt pekar ut tabellen User på serversidan. Det är på denna klass som jag använder mig av InsertAsync för att göra anropet. User är min klass som avspeglar tabellen User.
Det är på serversidan som logiken sker:
function insert(item, user, request) { item.userExternalAuthenticationId = user.userId; var userTable = tables.getTable('user'); userTable.where({ userExternalAuthenticationId: item.userExternalAuthenticationId }).read({ success: function(results) { if (results.length > 0) { var row = results[0]; row.displayName = item.displayName; userTable.update(row); request.respond(statusCodes.OK); } else { request.execute(); } }}); }
Det första jag gör är att jag sparar den externa användaridentiteten i userExternalAuthenticationId. I Guppy är detta användarens twitteridentitet.
Jag får tag på tabellen User genom metoden tables.getTable(“user”). Den använder jag sedan för att med metoden where söka i tabellen efter det userExternalAuthenticationId för att se om användaren redan finns lagrad där.
Syntaxen för where ser kanske lite konstig ut. Detta är ett asynkront mönster som används på serversidan. Genom att man anropar where på detta sätt så kan man fortsätta att göra andra saker i sitt skript tills sökningen är klar. När sökningen är klar kommer funktionen som är definierad av success att köras.
Denna funktion kollar om results innehåller några rader. Om den gör detta då vet vi att användaren redan finns i tabellen och vi gör istället update på tabellen där vi har bytt ut displayName mot det nya som användaren har givit. Om ingen rad har hittats då fortsätter vi och gör en vanlig insert.
Observera att vi alltid skall avsluta en metod med att antingen köra request.execute() eller request.response(). I response kan man ange vilken statusCode som skall skickas tillbaka.
Comments