public async Task <ActionResult <Data.Models.Store> > CreateNewStore(Data.Models.StoreForCreate newStore)
        {
            Data.Entities.Store dbNewStore = null;
            try
            {
                dbNewStore = _mapper.Map <Data.Entities.Store>(newStore);
            }
            catch (Exception ex)
            {
                return(BadRequest("Input is in invalid format: " + ex.Message));
            }

            if (dbNewStore == null)
            {
                return(BadRequest("Input is in invalid format"));
            }

            await _repository.AddAsync <Data.Entities.Store>(dbNewStore);

            await _repository.SaveChangesAsync();

            Data.Models.Store addedStore = _mapper.Map <Data.Models.Store>(dbNewStore);

            var url = _linkgenerator.GetPathByAction(HttpContext, "GetStoreByStoreId", "Stores", addedStore);

            return(this.Created(url, addedStore));
        }
예제 #2
0
        internal async Task Delete_Should_Return_NoContent_Record()
        {
            // Arrange
            var client = _factory.CreateClient();

            Data.Entities.Store store;

            using (var scope = _factory.Server.Host.Services.CreateScope())
            {
                var dbContext = scope.ServiceProvider.GetRequiredService <StoreDbContext>();

                store = new Data.Entities.Store
                {
                    Key            = "TestKey1",
                    Value          = "TestValue1",
                    ExpirationTime = DateTime.Now.AddDays(1)
                };

                await dbContext.Stores.AddAsync(store);

                await dbContext.SaveChangesAsync();
            }

            var requestUri = $"/api/keys/{store.Id}";

            // Act
            var response = await client.DeleteAsync(requestUri);

            // Assert
            Assert.Equal(HttpStatusCode.NoContent, response.StatusCode);
        }
        public async Task <ActionResult <Data.Models.Store> > PatchStore(string storeId, JsonPatchDocument <Data.Models.StoreForUpdate> patchDocument)
        {
            try
            {
                Data.Entities.Store dbStore = await _repository.GetStoreAsync(storeId);

                if (dbStore == null)
                {
                    return(NotFound());
                }

                var updatedStore = _mapper.Map <Data.Models.StoreForUpdate>(dbStore);
                patchDocument.ApplyTo(updatedStore, ModelState);

                _mapper.Map(updatedStore, dbStore);

                if (await _repository.SaveChangesAsync())
                {
                    Data.Models.Store savedStore = _mapper.Map <Data.Models.Store>(await _repository.GetStoreAsync(storeId));
                    return(Ok(savedStore));
                }
                else
                {
                    return(StatusCode(StatusCodes.Status500InternalServerError, "Unable to save to database"));
                }
            }
            catch (Exception ex)
            {
                return(StatusCode(StatusCodes.Status500InternalServerError, "Unable to patch store " + ex.Message));
            }
        }
        public async Task <ActionResult <Data.Models.Store> > UpdateStore(string storeId, Data.Models.StoreForUpdate updatedStore)
        {
            try
            {
                Data.Entities.Store dbStore = await _repository.GetStoreAsync(storeId);

                if (dbStore == null)
                {
                    return(NotFound());
                }

                _mapper.Map(updatedStore, dbStore);
                if (await _repository.SaveChangesAsync())
                {
                    Data.Models.Store savedStore = _mapper.Map <Data.Models.Store>(dbStore);
                    return(Ok(savedStore));
                }
                else
                {
                    return(BadRequest("Failed to update."));
                }
            }
            catch (Exception ex)
            {
                return(StatusCode(StatusCodes.Status500InternalServerError, "Database exception: " + ex.Message));
            }
        }
예제 #5
0
 public static StoreGetResponse ConvertToStoreGetResponse(this Data.Entities.Store store)
 {
     return(new StoreGetResponse
     {
         Key = store.Key,
         Value = store.Value,
         ExpirationTime = store.ExpirationTime,
         Id = store.Id
     });
 }
예제 #6
0
        internal async Task Put_Should_Return_Updated_Record()
        {
            // Arrange
            var client = _factory.CreateClient();

            Data.Entities.Store store;

            using (var scope = _factory.Server.Host.Services.CreateScope())
            {
                var dbContext = scope.ServiceProvider.GetRequiredService <StoreDbContext>();

                store = new Data.Entities.Store
                {
                    Key            = "TestKey1",
                    Value          = "TestValue1",
                    ExpirationTime = DateTime.Now.AddDays(1)
                };

                await dbContext.Stores.AddAsync(store);

                await dbContext.SaveChangesAsync();
            }

            var requestUri = $"/api/keys/{store.Id}";

            var requestModel = new
            {
                Key            = "TestKey2",
                Value          = "TestValue2",
                ExpirationTime = DateTime.Now.AddDays(2)
            };

            // Act
            var response = await client.PutAsJsonAsync(requestUri, requestModel);

            // Assert
            Assert.Equal(HttpStatusCode.OK, response.StatusCode);

            var responseString = await response.Content.ReadAsStringAsync();

            Assert.NotEmpty(responseString);

            var jObject = JObject.Parse(responseString);

            Assert.True(jObject.ContainsKey("id"));
            Assert.NotEqual(0, jObject["id"].Value <int>());

            Assert.True(jObject.ContainsKey("key"));
            Assert.Equal("TestKey2", jObject["key"].Value <string>());

            Assert.True(jObject.ContainsKey("value"));
            Assert.Equal("TestValue2", jObject["value"].Value <string>());

            Assert.True(jObject.ContainsKey("expirationTime"));
        }
예제 #7
0
        internal async Task Put_Should_Update_Expiration_By_Query()
        {
            // Arrange
            var client = _factory.CreateClient();

            Data.Entities.Store store;

            using (var scope = _factory.Server.Host.Services.CreateScope())
            {
                var dbContext = scope.ServiceProvider.GetRequiredService <StoreDbContext>();

                store = new Data.Entities.Store
                {
                    Key            = "TestKey1",
                    Value          = "TestValue1",
                    ExpirationTime = DateTime.Now.AddDays(1)
                };

                await dbContext.Stores.AddAsync(store);

                await dbContext.SaveChangesAsync();
            }

            double?expireIn   = 3600;
            var    requestUri = $"/api/keys/{store.Id}/{expireIn}";

            var requestModel = new
            {
                Key   = "TestKey2",
                Value = "TestValue2",
            };

            // Act
            var response = await client.PutAsJsonAsync(requestUri, requestModel);

            // Assert
            Assert.Equal(HttpStatusCode.OK, response.StatusCode);

            var responseString = await response.Content.ReadAsStringAsync();

            Assert.NotEmpty(responseString);

            var jObject = JObject.Parse(responseString);

            Assert.Equal(DateTime.Now.AddSeconds(3600).Hour, jObject["expirationTime"].Value <DateTime?>().Value.Hour);
            Assert.Equal(DateTime.Now.AddSeconds(3600).Minute, jObject["expirationTime"].Value <DateTime?>().Value.Minute);
            Assert.Equal(DateTime.Now.AddSeconds(3600).Second, jObject["expirationTime"].Value <DateTime?>().Value.Second);
        }
예제 #8
0
        internal async Task Put_Should_Return_Error_When_Record_Already_Exists()
        {
            // Arrange
            var client = _factory.CreateClient();

            Data.Entities.Store store;

            using (var scope = _factory.Server.Host.Services.CreateScope())
            {
                var dbContext = scope.ServiceProvider.GetRequiredService <StoreDbContext>();

                store = new Data.Entities.Store
                {
                    Key            = "TestKey1",
                    Value          = "TestValue1",
                    ExpirationTime = DateTime.Now.AddDays(1)
                };

                await dbContext.Stores.AddAsync(store);

                await dbContext.SaveChangesAsync();
            }

            var requestUri = $"/api/keys/{store.Id}";

            var requestModel = new
            {
                Key            = "TestKey1",
                Value          = "TestValue1",
                ExpirationTime = DateTime.Now.AddDays(2)
            };

            // Act
            var response = await client.PutAsJsonAsync(requestUri, requestModel);

            // Assert
            var responseModel = await response.Content.ReadAsAsync <string[]>();

            Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);

            Assert.Single(responseModel);
            Assert.Equal("This record already exists.", responseModel[0]);
        }
        public async Task <IActionResult> DeleteStore(string storeId)
        {
            try
            {
                Data.Entities.Store dbStore = await _repository.GetStoreAsync(storeId);

                if (dbStore == null)
                {
                    return(NotFound());
                }

                _repository.Delete <Data.Entities.Store>(dbStore);
                await _repository.SaveChangesAsync();

                return(NoContent());
            }
            catch (Exception ex)
            {
                return(StatusCode(StatusCodes.Status500InternalServerError, "Database exception: " + ex.Message));
            }
        }
예제 #10
0
        public async Task <BaseResponse <StorePostResponse> > Post(StorePutRequest request)
        {
            var response = new BaseResponse <StorePostResponse>();

            if (string.IsNullOrEmpty(request.Key))
            {
                response.Errors.Add("Key cannot be null or empty.");
            }

            if (string.IsNullOrEmpty(request.Value))
            {
                response.Errors.Add("Value cannot be null or empty.");
            }

            if (!request.ExpirationTime.HasValue)
            {
                request.ExpirationTime = DateTime.Now.AddDays(1);
            }

            var store = new Data.Entities.Store
            {
                Key            = request.Key,
                Value          = request.Value,
                ExpirationTime = request.ExpirationTime
            };

            if (await _repository.Head(store.Key, store.Value))
            {
                response.Errors.Add("This record already exists.");
            }

            if (!response.HasError)
            {
                var entity = await _repository.Post(store);

                response.Data = entity.ConvertToStorePostResponse();
            }

            return(response);
        }