public async Task <ActionResult> Update([FromRoute] string id, [FromBody] ResourcePostPayload payload) { if (!(this.HttpContext.Items["DbUser"] is User user)) { return(this.Unauthorized(null)); } try { var changes = new List <ChangeEntry>(); await using var db = new DatabaseContext(); var resource = await db.Resources .FirstOrDefaultAsync(n => !n.Deleted.HasValue && n.Identifier == id); if (resource == null) { throw new NotFoundResponseException(); } if (!string.IsNullOrWhiteSpace(payload.Name) && resource.Name != payload.Name) { changes.Add( new ChangeEntry { PropertyName = "Name", OldValue = resource.Name, NewValue = payload.Name }); resource.Name = payload.Name; } if (!string.IsNullOrWhiteSpace(payload.Url) && resource.Url != payload.Url) { changes.Add( new ChangeEntry { PropertyName = "URL", OldValue = resource.Url, NewValue = payload.Url }); resource.Url = payload.Url; } if (payload.Active.HasValue && payload.Active != resource.Active) { changes.Add( new ChangeEntry { PropertyName = "Active", OldValue = resource.Active?.ToString(), NewValue = payload.Active.Value.ToString() }); resource.Active = payload.Active; } if (changes.Any()) { resource.Updated = DateTimeOffset.Now; } await db.SaveChangesAsync(); var message = "Resource updated."; if (changes.Any()) { message += " " + string.Join(", ", changes); } await Log.LogInformation( message, user.Id, "resource", resource.Id); return(this.Ok(null)); } catch (BadRequestResponseException ex) { return(this.BadRequest(new { message = ex.Message })); } catch (NotFoundResponseException) { return(this.NotFound(null)); } catch { return(this.BadRequest(null)); } }
public async Task <ActionResult> Create([FromBody] ResourcePostPayload payload) { if (!(this.HttpContext.Items["DbUser"] is User user)) { return(this.Unauthorized(null)); } try { if (payload.Name == null || payload.Url == null) { throw new BadRequestResponseException("Name and/or URL cannot be blank"); } await using var db = new DatabaseContext(); var resource = await db.Resources .FirstOrDefaultAsync(n => !n.Deleted.HasValue && n.Name == payload.Name && n.Url == payload.Url); if (resource != null) { throw new BadRequestResponseException("A resource with the same name and URL already exists"); } var id = Guid.NewGuid().ToString().Substring(0, 8); while (true) { if (await db.Resources.CountAsync(n => n.Identifier == id) == 0) { break; } id = Guid.NewGuid().ToString().Substring(0, 8); } resource = new Resource { Created = DateTimeOffset.Now, Updated = DateTimeOffset.Now, Active = true, Identifier = id, Name = payload.Name, Url = payload.Url }; await db.Resources.AddAsync(resource); await db.SaveChangesAsync(); await Log.LogInformation( "Resource created.", user.Id, "resource", resource.Id); return(this.Ok(resource)); } catch (BadRequestResponseException ex) { return(this.BadRequest(new { message = ex.Message })); } catch { return(this.BadRequest(null)); } }