Added new many to many migration for libraries and users. Add Library now works and you can get Library (entity) objects from a user. LibraryDto project is upcoming.

This commit is contained in:
Joseph Milazzo 2020-12-18 12:01:45 -06:00
parent d5eed4e85d
commit b6e0e05205
9 changed files with 308 additions and 31 deletions

View File

@ -9,11 +9,13 @@ using API.Entities;
using API.Extensions;
using API.Interfaces;
using AutoMapper;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace API.Controllers
{
[Authorize]
public class LibraryController : BaseApiController
{
private readonly DataContext _context;

View File

@ -7,11 +7,13 @@ using API.DTOs;
using API.Entities;
using API.Extensions;
using API.Interfaces;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace API.Controllers
{
[Authorize]
public class UsersController : BaseApiController
{
private readonly DataContext _context;
@ -36,6 +38,8 @@ namespace API.Controllers
{
//_logger.Log(LogLevel.Debug, "Creating a new " + createLibraryDto.Type + " library");
var user = await _userRepository.GetUserByUsernameAsync(User.GetUsername());
if (user == null) return BadRequest("Could not validate user");
if (await _libraryRepository.LibraryExists(createLibraryDto.Name))
@ -44,26 +48,24 @@ namespace API.Controllers
}
// TODO: We probably need to clean the folders before we insert
var library = new Library()
var library = new Library
{
Name = createLibraryDto.Name,
Type = createLibraryDto.Type,
//Folders = createLibraryDto.Folders
AppUsers = new List<AppUser>() { user }
};
user.Libraries ??= new List<Library>(); // If user is null, then set it
user.Libraries.Add(library);
_userRepository.Update(user);
//_userRepository.Update(user);
if (await _userRepository.SaveAllAsync())
{
return Ok();
}
return BadRequest("Not implemented");
}
}

View File

@ -15,6 +15,6 @@ namespace API.DTOs
public DateTime Created { get; set; }
public DateTime LastActive { get; set; }
public bool IsAdmin { get; set; }
//public IEnumerable<Library> Libraries { get; set; }
public IEnumerable<Library> Libraries { get; set; }
}
}

View File

@ -1,4 +1,5 @@
using API.Entities;
using System;
using API.Entities;
using Microsoft.EntityFrameworkCore;
namespace API.Data

View File

@ -0,0 +1,141 @@
// <auto-generated />
using System;
using API.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace API.Data.Migrations
{
[DbContext(typeof(DataContext))]
[Migration("20201218173135_ManyToManyLibraries")]
partial class ManyToManyLibraries
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "5.0.1");
modelBuilder.Entity("API.Entities.AppUser", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<DateTime>("Created")
.HasColumnType("TEXT");
b.Property<bool>("IsAdmin")
.HasColumnType("INTEGER");
b.Property<DateTime>("LastActive")
.HasColumnType("TEXT");
b.Property<byte[]>("PasswordHash")
.HasColumnType("BLOB");
b.Property<byte[]>("PasswordSalt")
.HasColumnType("BLOB");
b.Property<uint>("RowVersion")
.IsConcurrencyToken()
.HasColumnType("INTEGER");
b.Property<string>("UserName")
.HasColumnType("TEXT");
b.HasKey("Id");
b.ToTable("Users");
});
modelBuilder.Entity("API.Entities.FolderPath", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<int>("LibraryId")
.HasColumnType("INTEGER");
b.Property<string>("Path")
.HasColumnType("TEXT");
b.HasKey("Id");
b.HasIndex("LibraryId");
b.ToTable("FolderPath");
});
modelBuilder.Entity("API.Entities.Library", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("CoverImage")
.HasColumnType("TEXT");
b.Property<string>("Name")
.HasColumnType("TEXT");
b.Property<int>("Type")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.ToTable("Library");
});
modelBuilder.Entity("AppUserLibrary", b =>
{
b.Property<int>("AppUsersId")
.HasColumnType("INTEGER");
b.Property<int>("LibrariesId")
.HasColumnType("INTEGER");
b.HasKey("AppUsersId", "LibrariesId");
b.HasIndex("LibrariesId");
b.ToTable("AppUserLibrary");
});
modelBuilder.Entity("API.Entities.FolderPath", b =>
{
b.HasOne("API.Entities.Library", "Library")
.WithMany("Folders")
.HasForeignKey("LibraryId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Library");
});
modelBuilder.Entity("AppUserLibrary", b =>
{
b.HasOne("API.Entities.AppUser", null)
.WithMany()
.HasForeignKey("AppUsersId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("API.Entities.Library", null)
.WithMany()
.HasForeignKey("LibrariesId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("API.Entities.Library", b =>
{
b.Navigation("Folders");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,119 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace API.Data.Migrations
{
public partial class ManyToManyLibraries : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_FolderPath_Library_LibraryId",
table: "FolderPath");
migrationBuilder.DropForeignKey(
name: "FK_Library_Users_AppUserId",
table: "Library");
migrationBuilder.DropIndex(
name: "IX_Library_AppUserId",
table: "Library");
migrationBuilder.DropColumn(
name: "AppUserId",
table: "Library");
migrationBuilder.AlterColumn<int>(
name: "LibraryId",
table: "FolderPath",
type: "INTEGER",
nullable: false,
defaultValue: 0,
oldClrType: typeof(int),
oldType: "INTEGER",
oldNullable: true);
migrationBuilder.CreateTable(
name: "AppUserLibrary",
columns: table => new
{
AppUsersId = table.Column<int>(type: "INTEGER", nullable: false),
LibrariesId = table.Column<int>(type: "INTEGER", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_AppUserLibrary", x => new { x.AppUsersId, x.LibrariesId });
table.ForeignKey(
name: "FK_AppUserLibrary_Library_LibrariesId",
column: x => x.LibrariesId,
principalTable: "Library",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_AppUserLibrary_Users_AppUsersId",
column: x => x.AppUsersId,
principalTable: "Users",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_AppUserLibrary_LibrariesId",
table: "AppUserLibrary",
column: "LibrariesId");
migrationBuilder.AddForeignKey(
name: "FK_FolderPath_Library_LibraryId",
table: "FolderPath",
column: "LibraryId",
principalTable: "Library",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_FolderPath_Library_LibraryId",
table: "FolderPath");
migrationBuilder.DropTable(
name: "AppUserLibrary");
migrationBuilder.AddColumn<int>(
name: "AppUserId",
table: "Library",
type: "INTEGER",
nullable: false,
defaultValue: 0);
migrationBuilder.AlterColumn<int>(
name: "LibraryId",
table: "FolderPath",
type: "INTEGER",
nullable: true,
oldClrType: typeof(int),
oldType: "INTEGER");
migrationBuilder.CreateIndex(
name: "IX_Library_AppUserId",
table: "Library",
column: "AppUserId");
migrationBuilder.AddForeignKey(
name: "FK_FolderPath_Library_LibraryId",
table: "FolderPath",
column: "LibraryId",
principalTable: "Library",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
migrationBuilder.AddForeignKey(
name: "FK_Library_Users_AppUserId",
table: "Library",
column: "AppUserId",
principalTable: "Users",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
}
}

View File

@ -55,7 +55,7 @@ namespace API.Data.Migrations
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<int?>("LibraryId")
b.Property<int>("LibraryId")
.HasColumnType("INTEGER");
b.Property<string>("Path")
@ -74,9 +74,6 @@ namespace API.Data.Migrations
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<int>("AppUserId")
.HasColumnType("INTEGER");
b.Property<string>("CoverImage")
.HasColumnType("TEXT");
@ -88,32 +85,48 @@ namespace API.Data.Migrations
b.HasKey("Id");
b.HasIndex("AppUserId");
b.ToTable("Library");
});
modelBuilder.Entity("AppUserLibrary", b =>
{
b.Property<int>("AppUsersId")
.HasColumnType("INTEGER");
b.Property<int>("LibrariesId")
.HasColumnType("INTEGER");
b.HasKey("AppUsersId", "LibrariesId");
b.HasIndex("LibrariesId");
b.ToTable("AppUserLibrary");
});
modelBuilder.Entity("API.Entities.FolderPath", b =>
{
b.HasOne("API.Entities.Library", null)
b.HasOne("API.Entities.Library", "Library")
.WithMany("Folders")
.HasForeignKey("LibraryId");
});
modelBuilder.Entity("API.Entities.Library", b =>
{
b.HasOne("API.Entities.AppUser", "AppUser")
.WithMany("Libraries")
.HasForeignKey("AppUserId")
.HasForeignKey("LibraryId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("AppUser");
b.Navigation("Library");
});
modelBuilder.Entity("API.Entities.AppUser", b =>
modelBuilder.Entity("AppUserLibrary", b =>
{
b.Navigation("Libraries");
b.HasOne("API.Entities.AppUser", null)
.WithMany()
.HasForeignKey("AppUsersId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("API.Entities.Library", null)
.WithMany()
.HasForeignKey("LibrariesId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("API.Entities.Library", b =>

View File

@ -43,7 +43,8 @@ namespace API.Data
public async Task<AppUser> GetUserByUsernameAsync(string username)
{
return await _context.Users.SingleOrDefaultAsync(x => x.UserName == username);
return await _context.Users
.SingleOrDefaultAsync(x => x.UserName == username);
}
public async Task<IEnumerable<MemberDto>> GetMembersAsync()

View File

@ -9,8 +9,6 @@ namespace API.Entities
public string CoverImage { get; set; }
public LibraryType Type { get; set; }
public ICollection<FolderPath> Folders { get; set; }
public AppUser AppUser { get; set; }
public int AppUserId { get; set; }
public ICollection<AppUser> AppUsers { get; set; }
}
}