Exemplo n.º 1
0
        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));
            }
        }
Exemplo n.º 2
0
        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));
            }
        }