From 8e90d1ab268535cbef203f2c4c15cb718d1b9989 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Thu, 30 Apr 2020 22:47:32 +0000 Subject: [PATCH] --- .../Controllers/TranslationController.cs | 61 +++++++++++++++++++ server/AyaNova/biz/TranslationBiz.cs | 38 ++++++++++++ server/AyaNova/resource/de.json | 1 - server/AyaNova/resource/en.json | 1 - server/AyaNova/resource/es.json | 1 - server/AyaNova/resource/fr.json | 1 - 6 files changed, 99 insertions(+), 4 deletions(-) diff --git a/server/AyaNova/Controllers/TranslationController.cs b/server/AyaNova/Controllers/TranslationController.cs index bfbf5b27..0a913cc6 100644 --- a/server/AyaNova/Controllers/TranslationController.cs +++ b/server/AyaNova/Controllers/TranslationController.cs @@ -237,6 +237,67 @@ namespace AyaNova.Api.Controllers return Ok(ApiOkResponse.Response(new { ConcurrencyToken = oFromDb.ConcurrencyToken }, true)); } + + + /// + /// Put (UpdateTranslationItemDisplayText) + /// Update a list of items with new display text + /// + /// Array of NewText/Id/Concurrency token objects. NewText is new display text, Id is TranslationItem Id, concurrency token is required + /// + [HttpPut("UpdateTranslationItemsDisplayText")] + public async Task PutTranslationItemsDisplayText([FromBody] List inObj) + { + if (serverState.IsClosed) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + + if (!ModelState.IsValid) + { + return BadRequest(new ApiErrorResponse(ModelState)); + } + + var oFromDb = await ct.TranslationItem.AsNoTracking().SingleOrDefaultAsync(m => m.Id == inObj[0].Id); + + if (oFromDb == null) + { + return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); + } + + //Now fetch translation for rights and to ensure not stock + var oDbParent = await ct.Translation.SingleOrDefaultAsync(x => x.Id == oFromDb.TranslationId); + if (oDbParent == null) + { + return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); + } + + if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.Translation)) + { + return StatusCode(403, new ApiNotAuthorizedResponse()); + } + + //Instantiate the business object handler + TranslationBiz biz = TranslationBiz.GetBiz(ct, HttpContext); + + try + { + if (!await biz.PutTranslationItemsDisplayTextAsync(inObj, oDbParent)) + { + return BadRequest(new ApiErrorResponse(biz.Errors)); + } + } + catch (DbUpdateConcurrencyException) + { + + //exists but was changed by another user + //I considered returning new and old record, but where would it end? + //Better to let the client decide what to do than to send extra data that is not required + return StatusCode(409, new ApiErrorResponse(ApiErrorCode.CONCURRENCY_CONFLICT)); + } + return NoContent(); + } + + + /// /// Put (UpdateTranslationName) /// Update a translation to change the name (non-stock Translations only) diff --git a/server/AyaNova/biz/TranslationBiz.cs b/server/AyaNova/biz/TranslationBiz.cs index 097b2c09..55c954a3 100644 --- a/server/AyaNova/biz/TranslationBiz.cs +++ b/server/AyaNova/biz/TranslationBiz.cs @@ -242,6 +242,44 @@ namespace AyaNova.Biz return true; } + internal async Task PutTranslationItemsDisplayTextAsync(List inObj, Translation dbParent) + { + + if (dbParent.Stock == true) + { + AddError(ApiErrorCode.INVALID_OPERATION, "object", "TranslationItem is from a Stock translation and cannot be modified"); + return false; + } + + foreach (NewTextIdConcurrencyTokenItem tit in inObj) + { + var titem=await ct.TranslationItem.SingleOrDefaultAsync(m => m.Id == tit.Id); + if(titem==null){ + AddError(ApiErrorCode.NOT_FOUND, $"Translation item ID {tit.Id}"); + return false; + } + //Replace the db object with the PUT object + //CopyObject.Copy(inObj, dbObj, "Id"); + titem.Display = tit.NewText; + + //Set "original" value of concurrency token to input token + //this will allow EF to check it out + ct.Entry(titem).OriginalValues["ConcurrencyToken"] = tit.ConcurrencyToken; + + //Only thing to validate is if it has data at all in it + if (string.IsNullOrWhiteSpace(tit.NewText)) + AddError(ApiErrorCode.VALIDATION_REQUIRED, $"Display (NewText) for Id: {tit.Id}"); + } + if (HasErrors) + return false; + await ct.SaveChangesAsync(); + + //Log + await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbParent.Id, AyaType.Translation, AyaEvent.Modified), ct); + + return true; + } + internal async Task PutTranslationNameAsync(Translation dbObj, NewTextIdConcurrencyTokenItem inObj) { diff --git a/server/AyaNova/resource/de.json b/server/AyaNova/resource/de.json index 9b42ffbc..63696125 100644 --- a/server/AyaNova/resource/de.json +++ b/server/AyaNova/resource/de.json @@ -1011,7 +1011,6 @@ "RecordHistoryModified": "Änderungsdatum dieses Datensatzes", "RecordHistoryModifier": "Datensatz wurde zuletzt geändert von", "AddRemoveButtons": "Schaltflächen hinzufügen und entfernen ...", - "ClientsToolBar": "Kundensymbolleiste", "Customize": "Anpassen ...", "CustomizeDialog_AlwaysShowFullMenus": "Immer vollständige Menüs anzeigen", "CustomizeDialog_CloseNoAmp": "Schließen", diff --git a/server/AyaNova/resource/en.json b/server/AyaNova/resource/en.json index 9199fd02..f32017d9 100644 --- a/server/AyaNova/resource/en.json +++ b/server/AyaNova/resource/en.json @@ -1011,7 +1011,6 @@ "RecordHistoryModified": "Date this record was last modified", "RecordHistoryModifier": "Last modifier of this record", "AddRemoveButtons": "Add and Remove Buttons....", - "ClientsToolBar": "Clients ToolBar", "Customize": "Customize....", "CustomizeDialog_AlwaysShowFullMenus": "Always show full menus", "CustomizeDialog_CloseNoAmp": "Close", diff --git a/server/AyaNova/resource/es.json b/server/AyaNova/resource/es.json index 6391c3f1..39d254fa 100644 --- a/server/AyaNova/resource/es.json +++ b/server/AyaNova/resource/es.json @@ -1011,7 +1011,6 @@ "RecordHistoryModified": "Fecha de modificación del registro", "RecordHistoryModifier": "Última modificación de este registro", "AddRemoveButtons": "Añadir y eliminar botones....", - "ClientsToolBar": "Barra de herramientas Clientes", "Customize": "Personalizar....", "CustomizeDialog_AlwaysShowFullMenus": "Mostrar siempre menús completos", "CustomizeDialog_CloseNoAmp": "Cerrar", diff --git a/server/AyaNova/resource/fr.json b/server/AyaNova/resource/fr.json index 2147111f..769e5ae8 100644 --- a/server/AyaNova/resource/fr.json +++ b/server/AyaNova/resource/fr.json @@ -1011,7 +1011,6 @@ "RecordHistoryModified": "Date de la dernière modification de cet enregistrement", "RecordHistoryModifier": "Dernier utilisateur ayant modifié cet enregistrement", "AddRemoveButtons": "Ajouter et supprimer des boutons....", - "ClientsToolBar": "Barre d'outils Clients", "Customize": "Personnaliser....", "CustomizeDialog_AlwaysShowFullMenus": "Toujours afficher les menus complets", "CustomizeDialog_CloseNoAmp": "Fermer",