public async Task <IActionResult> CreatePost([FromForm] string caption, [FromForm] IList <IFormFile> uploads, [FromRoute] string username) { if (uploads.Count <= 0) { return(BadRequest(new { Err = "Cannot create a post without any photo!" })); } // validate user var user = await DbContext.Users.SingleOrDefaultAsync(u => u.Username == username); if (user is null) { return(BadRequest(new { Err = "Unauthorized user!" })); } var transaction = DbContext.Database.BeginTransaction(); // create post content var post = new Post() { Caption = caption, UserId = user.Id, Created = DateTimeOffset.UtcNow }; DbContext.Add(post); await DbContext.SaveChangesAsync(); post = await DbContext.Posts .Include(p => p.User).ThenInclude(u => u.AvatarPhoto) .Where(p => p.Id == post.Id) .FirstOrDefaultAsync(); // create file uploads var uploadedFiles = uploads.Select(async upload => await PhotoUtils.UploadPhotoAsync(upload, PhotoServingPath)) .Select(task => task.Result) .Select(fileName => new Photo() { PostId = post.Id, FileName = fileName }); DbContext.AddRange(uploadedFiles); await DbContext.SaveChangesAsync(); await transaction.CommitAsync(); return(Created(Url.Action("GetPostById", "Post", new { id = post.Id }), ResponseModelFactory.Create(post))); }