From 16ae25f53550595d3919f249c2bb0211c80b9467 Mon Sep 17 00:00:00 2001 From: ZMiguel Alves Date: Thu, 14 Feb 2019 19:59:54 +0000 Subject: [PATCH 01/22] teste --- .../20190214194904_teste.Designer.cs | 366 ++++++++++++++++++ api/Migrations/20190214194904_teste.cs | 17 + api/Migrations/DataContextModelSnapshot.cs | 171 ++++---- 3 files changed, 469 insertions(+), 85 deletions(-) create mode 100644 api/Migrations/20190214194904_teste.Designer.cs create mode 100644 api/Migrations/20190214194904_teste.cs diff --git a/api/Migrations/20190214194904_teste.Designer.cs b/api/Migrations/20190214194904_teste.Designer.cs new file mode 100644 index 00000000..1d51f04f --- /dev/null +++ b/api/Migrations/20190214194904_teste.Designer.cs @@ -0,0 +1,366 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using api.Data; + +namespace api.Migrations +{ + [DbContext(typeof(DataContext))] + [Migration("20190214194904_teste")] + partial class teste + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.2.0-rtm-35687") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("RoleId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider"); + + b.Property("ProviderKey"); + + b.Property("ProviderDisplayName"); + + b.Property("UserId"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId"); + + b.Property("LoginProvider"); + + b.Property("Name"); + + b.Property("Value"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("api.Models.EventQR", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Event"); + + b.Property("EventLocId"); + + b.Property("Pontos"); + + b.Property("QRData"); + + b.Property("TeamId"); + + b.Property("TimeGen"); + + b.HasKey("Id"); + + b.HasIndex("TeamId"); + + b.ToTable("EventQR"); + }); + + modelBuilder.Entity("api.Models.Photo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("Description"); + + b.Property("IsMain"); + + b.Property("Url"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Photos"); + }); + + modelBuilder.Entity("api.Models.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Name") + .HasMaxLength(256); + + b.Property("NormalizedName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("api.Models.Team", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Event"); + + b.Property("Nome"); + + b.Property("NumMemb"); + + b.Property("Pontos"); + + b.Property("VisitedNum"); + + b.HasKey("Id"); + + b.ToTable("Teams"); + }); + + modelBuilder.Entity("api.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("About"); + + b.Property("AccessFailedCount"); + + b.Property("Adress"); + + b.Property("Age"); + + b.Property("City"); + + b.Property("Company"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Country"); + + b.Property("Degree"); + + b.Property("Email") + .HasMaxLength(256); + + b.Property("EmailConfirmed"); + + b.Property("FullName"); + + b.Property("Gender"); + + b.Property("LastLogin"); + + b.Property("LockoutEnabled"); + + b.Property("LockoutEnd"); + + b.Property("NormalizedEmail") + .HasMaxLength(256); + + b.Property("NormalizedUserName") + .HasMaxLength(256); + + b.Property("PasswordHash"); + + b.Property("Phone"); + + b.Property("PhoneNumber"); + + b.Property("PhoneNumberConfirmed"); + + b.Property("Position"); + + b.Property("ProfileIcon"); + + b.Property("QRcode"); + + b.Property("Registed"); + + b.Property("Role"); + + b.Property("SchoolYear"); + + b.Property("SecurityStamp"); + + b.Property("TeamId"); + + b.Property("TwoFactorEnabled"); + + b.Property("University"); + + b.Property("UserName") + .HasMaxLength(256); + + b.Property("linkedIn"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasName("UserNameIndex"); + + b.HasIndex("TeamId"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("api.Models.UserRole", b => + { + b.Property("UserId"); + + b.Property("RoleId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("api.Models.Value", b => + { + b.Property("id") + .ValueGeneratedOnAdd(); + + b.Property("Name"); + + b.HasKey("id"); + + b.ToTable("Values"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("api.Models.Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("api.Models.User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("api.Models.User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("api.Models.User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("api.Models.EventQR", b => + { + b.HasOne("api.Models.Team") + .WithMany("QRs") + .HasForeignKey("TeamId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("api.Models.Photo", b => + { + b.HasOne("api.Models.User", "User") + .WithMany("Photos") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("api.Models.User", b => + { + b.HasOne("api.Models.Team") + .WithMany("Users") + .HasForeignKey("TeamId"); + }); + + modelBuilder.Entity("api.Models.UserRole", b => + { + b.HasOne("api.Models.Role", "Role") + .WithMany("UserRoles") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("api.Models.User", "User") + .WithMany("UserRoles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/api/Migrations/20190214194904_teste.cs b/api/Migrations/20190214194904_teste.cs new file mode 100644 index 00000000..77781307 --- /dev/null +++ b/api/Migrations/20190214194904_teste.cs @@ -0,0 +1,17 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace api.Migrations +{ + public partial class teste : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} diff --git a/api/Migrations/DataContextModelSnapshot.cs b/api/Migrations/DataContextModelSnapshot.cs index bd11d6b2..d428d61a 100644 --- a/api/Migrations/DataContextModelSnapshot.cs +++ b/api/Migrations/DataContextModelSnapshot.cs @@ -14,7 +14,76 @@ namespace api.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "2.1.4-rtm-31024"); + .HasAnnotation("ProductVersion", "2.2.0-rtm-35687") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("RoleId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider"); + + b.Property("ProviderKey"); + + b.Property("ProviderDisplayName"); + + b.Property("UserId"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId"); + + b.Property("LoginProvider"); + + b.Property("Name"); + + b.Property("Value"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); modelBuilder.Entity("api.Models.EventQR", b => { @@ -224,70 +293,34 @@ namespace api.Migrations modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ClaimType"); - - b.Property("ClaimValue"); - - b.Property("RoleId"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims"); + b.HasOne("api.Models.Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ClaimType"); - - b.Property("ClaimValue"); - - b.Property("UserId"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims"); + b.HasOne("api.Models.User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => { - b.Property("LoginProvider"); - - b.Property("ProviderKey"); - - b.Property("ProviderDisplayName"); - - b.Property("UserId"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins"); + b.HasOne("api.Models.User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => { - b.Property("UserId"); - - b.Property("LoginProvider"); - - b.Property("Name"); - - b.Property("Value"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens"); + b.HasOne("api.Models.User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity("api.Models.EventQR", b => @@ -325,38 +358,6 @@ namespace api.Migrations .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade); }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("api.Models.Role") - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("api.Models.User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("api.Models.User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("api.Models.User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); #pragma warning restore 612, 618 } } From 50cbce7295edf953f9c3097495bb2ce8f258d357 Mon Sep 17 00:00:00 2001 From: ZMiguel Alves Date: Thu, 14 Feb 2019 20:40:19 +0000 Subject: [PATCH 02/22] Auto stash before rebase of "origin/zmiguel" --- api/Startup.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/Startup.cs b/api/Startup.cs index e2129417..cae87f6f 100644 --- a/api/Startup.cs +++ b/api/Startup.cs @@ -45,7 +45,7 @@ namespace api services.AddAutoMapper(); services.AddScoped(); - + //define a connection string indicada em appsettings.json services.AddDbContext(x=>x.UseMySql(Configuration.GetConnectionString("DefaultConnection"))); From 0f0aa1436b5d5811c77be092d663afad1426ea12 Mon Sep 17 00:00:00 2001 From: ZMiguel Alves Date: Sat, 23 Feb 2019 23:06:56 +0000 Subject: [PATCH 03/22] Master merge, Teams & Events models --- .../20190223225342_team_event.Designer.cs | 267 ++++++++++++++++++ api/Migrations/20190223225342_team_event.cs | 17 ++ ...0190223225824_Teams_and_Events.Designer.cs | 267 ++++++++++++++++++ .../20190223225824_Teams_and_Events.cs | 17 ++ api/Models/Event.cs | 14 + api/Models/EventLoc.cs | 18 ++ api/Models/EventLocVisited.cs | 14 + api/Models/Team.cs | 17 ++ api/Models/User.cs | 2 +- api/Models/Value.cs | 1 - api/obj/Debug/netcoreapp2.1/api.assets.cache | Bin 133027 -> 130703 bytes .../Debug/netcoreapp2.1/project.razor.json | 2 +- 12 files changed, 633 insertions(+), 3 deletions(-) create mode 100644 api/Migrations/20190223225342_team_event.Designer.cs create mode 100644 api/Migrations/20190223225342_team_event.cs create mode 100644 api/Migrations/20190223225824_Teams_and_Events.Designer.cs create mode 100644 api/Migrations/20190223225824_Teams_and_Events.cs create mode 100644 api/Models/Event.cs create mode 100644 api/Models/EventLoc.cs create mode 100644 api/Models/EventLocVisited.cs create mode 100644 api/Models/Team.cs diff --git a/api/Migrations/20190223225342_team_event.Designer.cs b/api/Migrations/20190223225342_team_event.Designer.cs new file mode 100644 index 00000000..036b19a0 --- /dev/null +++ b/api/Migrations/20190223225342_team_event.Designer.cs @@ -0,0 +1,267 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using api.Data; + +namespace api.Migrations +{ + [DbContext(typeof(DataContext))] + [Migration("20190223225342_team_event")] + partial class team_event + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.2.0-rtm-35687") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("RoleId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider"); + + b.Property("ProviderKey"); + + b.Property("ProviderDisplayName"); + + b.Property("UserId"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId"); + + b.Property("LoginProvider"); + + b.Property("Name"); + + b.Property("Value"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("api.Models.Photo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("Description"); + + b.Property("IsMain"); + + b.Property("Url"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Photos"); + }); + + modelBuilder.Entity("api.Models.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Name") + .HasMaxLength(256); + + b.Property("NormalizedName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("api.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Email") + .HasMaxLength(256); + + b.Property("EmailConfirmed"); + + b.Property("LockoutEnabled"); + + b.Property("LockoutEnd"); + + b.Property("NormalizedEmail") + .HasMaxLength(256); + + b.Property("NormalizedUserName") + .HasMaxLength(256); + + b.Property("PasswordHash"); + + b.Property("PhoneNumber"); + + b.Property("PhoneNumberConfirmed"); + + b.Property("QRcode"); + + b.Property("SecurityStamp"); + + b.Property("TwoFactorEnabled"); + + b.Property("UserName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("api.Models.UserRole", b => + { + b.Property("UserId"); + + b.Property("RoleId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("api.Models.Value", b => + { + b.Property("id") + .ValueGeneratedOnAdd(); + + b.Property("Name"); + + b.HasKey("id"); + + b.ToTable("Values"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("api.Models.Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("api.Models.User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("api.Models.User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("api.Models.User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("api.Models.Photo", b => + { + b.HasOne("api.Models.User", "User") + .WithMany("Photos") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("api.Models.UserRole", b => + { + b.HasOne("api.Models.Role", "Role") + .WithMany("UserRoles") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("api.Models.User", "User") + .WithMany("UserRoles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/api/Migrations/20190223225342_team_event.cs b/api/Migrations/20190223225342_team_event.cs new file mode 100644 index 00000000..54f653db --- /dev/null +++ b/api/Migrations/20190223225342_team_event.cs @@ -0,0 +1,17 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace api.Migrations +{ + public partial class team_event : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} diff --git a/api/Migrations/20190223225824_Teams_and_Events.Designer.cs b/api/Migrations/20190223225824_Teams_and_Events.Designer.cs new file mode 100644 index 00000000..eadba6da --- /dev/null +++ b/api/Migrations/20190223225824_Teams_and_Events.Designer.cs @@ -0,0 +1,267 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using api.Data; + +namespace api.Migrations +{ + [DbContext(typeof(DataContext))] + [Migration("20190223225824_Teams_and_Events")] + partial class Teams_and_Events + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.2.0-rtm-35687") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("RoleId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider"); + + b.Property("ProviderKey"); + + b.Property("ProviderDisplayName"); + + b.Property("UserId"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId"); + + b.Property("LoginProvider"); + + b.Property("Name"); + + b.Property("Value"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("api.Models.Photo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("Description"); + + b.Property("IsMain"); + + b.Property("Url"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Photos"); + }); + + modelBuilder.Entity("api.Models.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Name") + .HasMaxLength(256); + + b.Property("NormalizedName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("api.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Email") + .HasMaxLength(256); + + b.Property("EmailConfirmed"); + + b.Property("LockoutEnabled"); + + b.Property("LockoutEnd"); + + b.Property("NormalizedEmail") + .HasMaxLength(256); + + b.Property("NormalizedUserName") + .HasMaxLength(256); + + b.Property("PasswordHash"); + + b.Property("PhoneNumber"); + + b.Property("PhoneNumberConfirmed"); + + b.Property("QRcode"); + + b.Property("SecurityStamp"); + + b.Property("TwoFactorEnabled"); + + b.Property("UserName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("api.Models.UserRole", b => + { + b.Property("UserId"); + + b.Property("RoleId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("api.Models.Value", b => + { + b.Property("id") + .ValueGeneratedOnAdd(); + + b.Property("Name"); + + b.HasKey("id"); + + b.ToTable("Values"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("api.Models.Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("api.Models.User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("api.Models.User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("api.Models.User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("api.Models.Photo", b => + { + b.HasOne("api.Models.User", "User") + .WithMany("Photos") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("api.Models.UserRole", b => + { + b.HasOne("api.Models.Role", "Role") + .WithMany("UserRoles") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("api.Models.User", "User") + .WithMany("UserRoles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/api/Migrations/20190223225824_Teams_and_Events.cs b/api/Migrations/20190223225824_Teams_and_Events.cs new file mode 100644 index 00000000..dc9066f2 --- /dev/null +++ b/api/Migrations/20190223225824_Teams_and_Events.cs @@ -0,0 +1,17 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace api.Migrations +{ + public partial class Teams_and_Events : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} diff --git a/api/Models/Event.cs b/api/Models/Event.cs new file mode 100644 index 00000000..5246e9ca --- /dev/null +++ b/api/Models/Event.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; + +namespace api.Models + +{ + public class Event + { + public int Id{get;set;} //id + public String Nome{get;set;} //nome + public String Desc{get;set;} //descrição + + } +} \ No newline at end of file diff --git a/api/Models/EventLoc.cs b/api/Models/EventLoc.cs new file mode 100644 index 00000000..96ec6a23 --- /dev/null +++ b/api/Models/EventLoc.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace api.Models + +{ + public class EventLoc + { + public int Id{get;set;} //id + public int EventId{get;set;} //Event ID + public float Lat{get;set;} //latitude + public float Long{get;set;} //longitude + public String Nome{get;set;} //Nome da localização + public String Desc{get;set;} //Descrição + public Photo Img{get;set;} //Foto da localização + + } +} \ No newline at end of file diff --git a/api/Models/EventLocVisited.cs b/api/Models/EventLocVisited.cs new file mode 100644 index 00000000..3cb2b045 --- /dev/null +++ b/api/Models/EventLocVisited.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; + +namespace api.Models + +{ + public class EventLocVisited + { + public int Id{get;set;} //id + public Team Team{get;set;} //teamQRID + public EventLoc Location{get;set;} //location + public DateTime timestamp{get;set;} //time + } +} \ No newline at end of file diff --git a/api/Models/Team.cs b/api/Models/Team.cs new file mode 100644 index 00000000..16c5f004 --- /dev/null +++ b/api/Models/Team.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace api.Models + +{ + public class Team + { + public string QRcode{get;set;} //QR ID code + public int EventId{get;set;} //equipa para o evento ID + public string Nome{get;set;} //Nome da equipa + public User Cap{get;set;} //Capitao da equipa + public ICollection Membros {get;set;} //Membros da equipa + public int NMembros {get;set;} //Numero de Membros na equipa + public int Pontos {get;set;} //Postos da equipa + } +} \ No newline at end of file diff --git a/api/Models/User.cs b/api/Models/User.cs index 5faa326d..8b9f10f0 100755 --- a/api/Models/User.cs +++ b/api/Models/User.cs @@ -7,7 +7,7 @@ namespace api.Models { public class User: IdentityUser { - public string QRcode{get;set;} + public string QRcode{get;set;} public ICollection UserRoles{get;set;} public ICollection Photos {get;set;} diff --git a/api/Models/Value.cs b/api/Models/Value.cs index 362f638b..140b15cc 100755 --- a/api/Models/Value.cs +++ b/api/Models/Value.cs @@ -1,4 +1,3 @@ - namespace api.Models { public class Value diff --git a/api/obj/Debug/netcoreapp2.1/api.assets.cache b/api/obj/Debug/netcoreapp2.1/api.assets.cache index b5b8a63c31742137695f16d273d1e5110dcdbf97..59e77d25bf802ff8bfcc6a5cb9a155d8309534a8 100755 GIT binary patch literal 130703 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 literal 133027 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 skU2c Date: Sat, 23 Feb 2019 23:30:54 +0000 Subject: [PATCH 04/22] Migrations cleanup, teams and event DB --- api/Data/DataContext.cs | 6 + api/Migrations/20180829184152_update.cs | 285 ---------------- api/Migrations/20190214194904_teste.cs | 17 - api/Migrations/20190221000457_a.Designer.cs | 303 ----------------- api/Migrations/20190221000551_c.Designer.cs | 267 --------------- api/Migrations/20190221000551_c.cs | 181 ---------- .../20190223225342_team_event.Designer.cs | 267 --------------- api/Migrations/20190223225342_team_event.cs | 17 - ...0190223225824_Teams_and_Events.Designer.cs | 267 --------------- .../20190223225824_Teams_and_Events.cs | 17 - ...=> 20190223232738_TeamsEvents.Designer.cs} | 139 ++++---- ...457_a.cs => 20190223232738_TeamsEvents.cs} | 319 ++++++++++++------ api/Migrations/DataContextModelSnapshot.cs | 118 +++++++ api/Models/Team.cs | 1 + 14 files changed, 429 insertions(+), 1775 deletions(-) delete mode 100755 api/Migrations/20180829184152_update.cs delete mode 100644 api/Migrations/20190214194904_teste.cs delete mode 100644 api/Migrations/20190221000457_a.Designer.cs delete mode 100644 api/Migrations/20190221000551_c.Designer.cs delete mode 100644 api/Migrations/20190221000551_c.cs delete mode 100644 api/Migrations/20190223225342_team_event.Designer.cs delete mode 100644 api/Migrations/20190223225342_team_event.cs delete mode 100644 api/Migrations/20190223225824_Teams_and_Events.Designer.cs delete mode 100644 api/Migrations/20190223225824_Teams_and_Events.cs rename api/Migrations/{20190214194904_teste.Designer.cs => 20190223232738_TeamsEvents.Designer.cs} (78%) rename api/Migrations/{20190221000457_a.cs => 20190223232738_TeamsEvents.cs} (58%) diff --git a/api/Data/DataContext.cs b/api/Data/DataContext.cs index 43d1c208..8e1350bb 100755 --- a/api/Data/DataContext.cs +++ b/api/Data/DataContext.cs @@ -14,7 +14,13 @@ namespace api.Data public DbSet Photos {get;set;} + public DbSet Teams {get;set;} + public DbSet Events {get;set;} + + public DbSet EventLocs {get;set;} + + public DbSet EventLocsVisited {get;set;} protected override void OnModelCreating(ModelBuilder builder) { diff --git a/api/Migrations/20180829184152_update.cs b/api/Migrations/20180829184152_update.cs deleted file mode 100755 index b196307d..00000000 --- a/api/Migrations/20180829184152_update.cs +++ /dev/null @@ -1,285 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -namespace api.Migrations -{ - public partial class update : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "AspNetRoles", - columns: table => new - { - Id = table.Column(nullable: false) - .Annotation("Sqlite:Autoincrement", true), - Name = table.Column(maxLength: 256, nullable: true), - NormalizedName = table.Column(maxLength: 256, nullable: true), - ConcurrencyStamp = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetRoles", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AspNetUsers", - columns: table => new - { - AccessFailedCount = table.Column(nullable: false), - EmailConfirmed = table.Column(nullable: false), - Id = table.Column(nullable: false) - .Annotation("Sqlite:Autoincrement", true), - LockoutEnabled = table.Column(nullable: false), - LockoutEnd = table.Column(nullable: true), - PhoneNumberConfirmed = table.Column(nullable: false), - TwoFactorEnabled = table.Column(nullable: false), - UserName = table.Column(maxLength: 256, nullable: true), - NormalizedUserName = table.Column(maxLength: 256, nullable: true), - Email = table.Column(maxLength: 256, nullable: true), - NormalizedEmail = table.Column(maxLength: 256, nullable: true), - PasswordHash = table.Column(nullable: true), - SecurityStamp = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), - PhoneNumber = table.Column(nullable: true), - FullName = table.Column(nullable: true), - Gender = table.Column(nullable: true), - Age = table.Column(nullable: false), - Phone = table.Column(nullable: false), - University = table.Column(nullable: true), - Adress = table.Column(nullable: true), - Country = table.Column(nullable: true), - City = table.Column(nullable: true), - linkedIn = table.Column(nullable: true), - LastLogin = table.Column(nullable: false), - Registed = table.Column(nullable: false), - QRcode = table.Column(nullable: true), - Role = table.Column(nullable: true), - Degree = table.Column(nullable: true), - SchoolYear = table.Column(nullable: false), - ProfileIcon = table.Column(nullable: true), - Company = table.Column(nullable: true), - Position = table.Column(nullable: true), - About = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUsers", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Values", - columns: table => new - { - id = table.Column(nullable: false) - .Annotation("Sqlite:Autoincrement", true), - Name = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Values", x => x.id); - }); - - migrationBuilder.CreateTable( - name: "AspNetRoleClaims", - columns: table => new - { - Id = table.Column(nullable: false) - .Annotation("Sqlite:Autoincrement", true), - RoleId = table.Column(nullable: false), - ClaimType = table.Column(nullable: true), - ClaimValue = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetRoleClaims_AspNetRoles_RoleId", - column: x => x.RoleId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserClaims", - columns: table => new - { - Id = table.Column(nullable: false) - .Annotation("Sqlite:Autoincrement", true), - UserId = table.Column(nullable: false), - ClaimType = table.Column(nullable: true), - ClaimValue = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetUserClaims_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserLogins", - columns: table => new - { - LoginProvider = table.Column(nullable: false), - ProviderKey = table.Column(nullable: false), - ProviderDisplayName = table.Column(nullable: true), - UserId = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey }); - table.ForeignKey( - name: "FK_AspNetUserLogins_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserRoles", - columns: table => new - { - RoleId = table.Column(nullable: false), - UserId = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId }); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetRoles_RoleId", - column: x => x.RoleId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserTokens", - columns: table => new - { - UserId = table.Column(nullable: false), - LoginProvider = table.Column(nullable: false), - Name = table.Column(nullable: false), - Value = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); - table.ForeignKey( - name: "FK_AspNetUserTokens_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Photos", - columns: table => new - { - Id = table.Column(nullable: false) - .Annotation("Sqlite:Autoincrement", true), - Url = table.Column(nullable: true), - Description = table.Column(nullable: true), - DateAdded = table.Column(nullable: false), - IsMain = table.Column(nullable: false), - UserId = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Photos", x => x.Id); - table.ForeignKey( - name: "FK_Photos_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_AspNetRoleClaims_RoleId", - table: "AspNetRoleClaims", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "RoleNameIndex", - table: "AspNetRoles", - column: "NormalizedName", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserClaims_UserId", - table: "AspNetUserClaims", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserLogins_UserId", - table: "AspNetUserLogins", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserRoles_RoleId", - table: "AspNetUserRoles", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "EmailIndex", - table: "AspNetUsers", - column: "NormalizedEmail"); - - migrationBuilder.CreateIndex( - name: "UserNameIndex", - table: "AspNetUsers", - column: "NormalizedUserName", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_Photos_UserId", - table: "Photos", - column: "UserId"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "AspNetRoleClaims"); - - migrationBuilder.DropTable( - name: "AspNetUserClaims"); - - migrationBuilder.DropTable( - name: "AspNetUserLogins"); - - migrationBuilder.DropTable( - name: "AspNetUserRoles"); - - migrationBuilder.DropTable( - name: "AspNetUserTokens"); - - migrationBuilder.DropTable( - name: "Photos"); - - migrationBuilder.DropTable( - name: "Values"); - - migrationBuilder.DropTable( - name: "AspNetRoles"); - - migrationBuilder.DropTable( - name: "AspNetUsers"); - } - } -} diff --git a/api/Migrations/20190214194904_teste.cs b/api/Migrations/20190214194904_teste.cs deleted file mode 100644 index 77781307..00000000 --- a/api/Migrations/20190214194904_teste.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -namespace api.Migrations -{ - public partial class teste : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - - } - } -} diff --git a/api/Migrations/20190221000457_a.Designer.cs b/api/Migrations/20190221000457_a.Designer.cs deleted file mode 100644 index ec333f00..00000000 --- a/api/Migrations/20190221000457_a.Designer.cs +++ /dev/null @@ -1,303 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using api.Data; - -namespace api.Migrations -{ - [DbContext(typeof(DataContext))] - [Migration("20190221000457_a")] - partial class a - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "2.2.0-rtm-35687") - .HasAnnotation("Relational:MaxIdentifierLength", 64); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ClaimType"); - - b.Property("ClaimValue"); - - b.Property("RoleId"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ClaimType"); - - b.Property("ClaimValue"); - - b.Property("UserId"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider"); - - b.Property("ProviderKey"); - - b.Property("ProviderDisplayName"); - - b.Property("UserId"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId"); - - b.Property("LoginProvider"); - - b.Property("Name"); - - b.Property("Value"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens"); - }); - - modelBuilder.Entity("api.Models.Photo", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("DateAdded"); - - b.Property("Description"); - - b.Property("IsMain"); - - b.Property("Url"); - - b.Property("UserId"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("Photos"); - }); - - modelBuilder.Entity("api.Models.Role", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken(); - - b.Property("Name") - .HasMaxLength(256); - - b.Property("NormalizedName") - .HasMaxLength(256); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasName("RoleNameIndex"); - - b.ToTable("AspNetRoles"); - }); - - modelBuilder.Entity("api.Models.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("About"); - - b.Property("AccessFailedCount"); - - b.Property("Adress"); - - b.Property("Age"); - - b.Property("City"); - - b.Property("Company"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken(); - - b.Property("Country"); - - b.Property("Degree"); - - b.Property("Email") - .HasMaxLength(256); - - b.Property("EmailConfirmed"); - - b.Property("FullName"); - - b.Property("Gender"); - - b.Property("LastLogin"); - - b.Property("LockoutEnabled"); - - b.Property("LockoutEnd"); - - b.Property("NormalizedEmail") - .HasMaxLength(256); - - b.Property("NormalizedUserName") - .HasMaxLength(256); - - b.Property("PasswordHash"); - - b.Property("Phone"); - - b.Property("PhoneNumber"); - - b.Property("PhoneNumberConfirmed"); - - b.Property("Position"); - - b.Property("ProfileIcon"); - - b.Property("QRcode"); - - b.Property("Registed"); - - b.Property("Role"); - - b.Property("SchoolYear"); - - b.Property("SecurityStamp"); - - b.Property("TwoFactorEnabled"); - - b.Property("University"); - - b.Property("UserName") - .HasMaxLength(256); - - b.Property("linkedIn"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasName("UserNameIndex"); - - b.ToTable("AspNetUsers"); - }); - - modelBuilder.Entity("api.Models.UserRole", b => - { - b.Property("UserId"); - - b.Property("RoleId"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles"); - }); - - modelBuilder.Entity("api.Models.Value", b => - { - b.Property("id") - .ValueGeneratedOnAdd(); - - b.Property("Name"); - - b.HasKey("id"); - - b.ToTable("Values"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("api.Models.Role") - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("api.Models.User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("api.Models.User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("api.Models.User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("api.Models.Photo", b => - { - b.HasOne("api.Models.User", "User") - .WithMany("Photos") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("api.Models.UserRole", b => - { - b.HasOne("api.Models.Role", "Role") - .WithMany("UserRoles") - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("api.Models.User", "User") - .WithMany("UserRoles") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/api/Migrations/20190221000551_c.Designer.cs b/api/Migrations/20190221000551_c.Designer.cs deleted file mode 100644 index 025098af..00000000 --- a/api/Migrations/20190221000551_c.Designer.cs +++ /dev/null @@ -1,267 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using api.Data; - -namespace api.Migrations -{ - [DbContext(typeof(DataContext))] - [Migration("20190221000551_c")] - partial class c - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "2.2.0-rtm-35687") - .HasAnnotation("Relational:MaxIdentifierLength", 64); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ClaimType"); - - b.Property("ClaimValue"); - - b.Property("RoleId"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ClaimType"); - - b.Property("ClaimValue"); - - b.Property("UserId"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider"); - - b.Property("ProviderKey"); - - b.Property("ProviderDisplayName"); - - b.Property("UserId"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId"); - - b.Property("LoginProvider"); - - b.Property("Name"); - - b.Property("Value"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens"); - }); - - modelBuilder.Entity("api.Models.Photo", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("DateAdded"); - - b.Property("Description"); - - b.Property("IsMain"); - - b.Property("Url"); - - b.Property("UserId"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("Photos"); - }); - - modelBuilder.Entity("api.Models.Role", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken(); - - b.Property("Name") - .HasMaxLength(256); - - b.Property("NormalizedName") - .HasMaxLength(256); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasName("RoleNameIndex"); - - b.ToTable("AspNetRoles"); - }); - - modelBuilder.Entity("api.Models.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("AccessFailedCount"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken(); - - b.Property("Email") - .HasMaxLength(256); - - b.Property("EmailConfirmed"); - - b.Property("LockoutEnabled"); - - b.Property("LockoutEnd"); - - b.Property("NormalizedEmail") - .HasMaxLength(256); - - b.Property("NormalizedUserName") - .HasMaxLength(256); - - b.Property("PasswordHash"); - - b.Property("PhoneNumber"); - - b.Property("PhoneNumberConfirmed"); - - b.Property("QRcode"); - - b.Property("SecurityStamp"); - - b.Property("TwoFactorEnabled"); - - b.Property("UserName") - .HasMaxLength(256); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasName("UserNameIndex"); - - b.ToTable("AspNetUsers"); - }); - - modelBuilder.Entity("api.Models.UserRole", b => - { - b.Property("UserId"); - - b.Property("RoleId"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles"); - }); - - modelBuilder.Entity("api.Models.Value", b => - { - b.Property("id") - .ValueGeneratedOnAdd(); - - b.Property("Name"); - - b.HasKey("id"); - - b.ToTable("Values"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("api.Models.Role") - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("api.Models.User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("api.Models.User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("api.Models.User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("api.Models.Photo", b => - { - b.HasOne("api.Models.User", "User") - .WithMany("Photos") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("api.Models.UserRole", b => - { - b.HasOne("api.Models.Role", "Role") - .WithMany("UserRoles") - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("api.Models.User", "User") - .WithMany("UserRoles") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/api/Migrations/20190221000551_c.cs b/api/Migrations/20190221000551_c.cs deleted file mode 100644 index 250a6706..00000000 --- a/api/Migrations/20190221000551_c.cs +++ /dev/null @@ -1,181 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -namespace api.Migrations -{ - public partial class c : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "About", - table: "AspNetUsers"); - - migrationBuilder.DropColumn( - name: "Adress", - table: "AspNetUsers"); - - migrationBuilder.DropColumn( - name: "Age", - table: "AspNetUsers"); - - migrationBuilder.DropColumn( - name: "City", - table: "AspNetUsers"); - - migrationBuilder.DropColumn( - name: "Company", - table: "AspNetUsers"); - - migrationBuilder.DropColumn( - name: "Country", - table: "AspNetUsers"); - - migrationBuilder.DropColumn( - name: "Degree", - table: "AspNetUsers"); - - migrationBuilder.DropColumn( - name: "FullName", - table: "AspNetUsers"); - - migrationBuilder.DropColumn( - name: "Gender", - table: "AspNetUsers"); - - migrationBuilder.DropColumn( - name: "LastLogin", - table: "AspNetUsers"); - - migrationBuilder.DropColumn( - name: "Phone", - table: "AspNetUsers"); - - migrationBuilder.DropColumn( - name: "Position", - table: "AspNetUsers"); - - migrationBuilder.DropColumn( - name: "ProfileIcon", - table: "AspNetUsers"); - - migrationBuilder.DropColumn( - name: "Registed", - table: "AspNetUsers"); - - migrationBuilder.DropColumn( - name: "Role", - table: "AspNetUsers"); - - migrationBuilder.DropColumn( - name: "SchoolYear", - table: "AspNetUsers"); - - migrationBuilder.DropColumn( - name: "University", - table: "AspNetUsers"); - - migrationBuilder.DropColumn( - name: "linkedIn", - table: "AspNetUsers"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "About", - table: "AspNetUsers", - nullable: true); - - migrationBuilder.AddColumn( - name: "Adress", - table: "AspNetUsers", - nullable: true); - - migrationBuilder.AddColumn( - name: "Age", - table: "AspNetUsers", - nullable: false, - defaultValue: 0); - - migrationBuilder.AddColumn( - name: "City", - table: "AspNetUsers", - nullable: true); - - migrationBuilder.AddColumn( - name: "Company", - table: "AspNetUsers", - nullable: true); - - migrationBuilder.AddColumn( - name: "Country", - table: "AspNetUsers", - nullable: true); - - migrationBuilder.AddColumn( - name: "Degree", - table: "AspNetUsers", - nullable: true); - - migrationBuilder.AddColumn( - name: "FullName", - table: "AspNetUsers", - nullable: true); - - migrationBuilder.AddColumn( - name: "Gender", - table: "AspNetUsers", - nullable: true); - - migrationBuilder.AddColumn( - name: "LastLogin", - table: "AspNetUsers", - nullable: false, - defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); - - migrationBuilder.AddColumn( - name: "Phone", - table: "AspNetUsers", - nullable: false, - defaultValue: 0); - - migrationBuilder.AddColumn( - name: "Position", - table: "AspNetUsers", - nullable: true); - - migrationBuilder.AddColumn( - name: "ProfileIcon", - table: "AspNetUsers", - nullable: true); - - migrationBuilder.AddColumn( - name: "Registed", - table: "AspNetUsers", - nullable: false, - defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); - - migrationBuilder.AddColumn( - name: "Role", - table: "AspNetUsers", - nullable: true); - - migrationBuilder.AddColumn( - name: "SchoolYear", - table: "AspNetUsers", - nullable: false, - defaultValue: 0); - - migrationBuilder.AddColumn( - name: "University", - table: "AspNetUsers", - nullable: true); - - migrationBuilder.AddColumn( - name: "linkedIn", - table: "AspNetUsers", - nullable: true); - } - } -} diff --git a/api/Migrations/20190223225342_team_event.Designer.cs b/api/Migrations/20190223225342_team_event.Designer.cs deleted file mode 100644 index 036b19a0..00000000 --- a/api/Migrations/20190223225342_team_event.Designer.cs +++ /dev/null @@ -1,267 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using api.Data; - -namespace api.Migrations -{ - [DbContext(typeof(DataContext))] - [Migration("20190223225342_team_event")] - partial class team_event - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "2.2.0-rtm-35687") - .HasAnnotation("Relational:MaxIdentifierLength", 64); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ClaimType"); - - b.Property("ClaimValue"); - - b.Property("RoleId"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ClaimType"); - - b.Property("ClaimValue"); - - b.Property("UserId"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider"); - - b.Property("ProviderKey"); - - b.Property("ProviderDisplayName"); - - b.Property("UserId"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId"); - - b.Property("LoginProvider"); - - b.Property("Name"); - - b.Property("Value"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens"); - }); - - modelBuilder.Entity("api.Models.Photo", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("DateAdded"); - - b.Property("Description"); - - b.Property("IsMain"); - - b.Property("Url"); - - b.Property("UserId"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("Photos"); - }); - - modelBuilder.Entity("api.Models.Role", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken(); - - b.Property("Name") - .HasMaxLength(256); - - b.Property("NormalizedName") - .HasMaxLength(256); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasName("RoleNameIndex"); - - b.ToTable("AspNetRoles"); - }); - - modelBuilder.Entity("api.Models.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("AccessFailedCount"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken(); - - b.Property("Email") - .HasMaxLength(256); - - b.Property("EmailConfirmed"); - - b.Property("LockoutEnabled"); - - b.Property("LockoutEnd"); - - b.Property("NormalizedEmail") - .HasMaxLength(256); - - b.Property("NormalizedUserName") - .HasMaxLength(256); - - b.Property("PasswordHash"); - - b.Property("PhoneNumber"); - - b.Property("PhoneNumberConfirmed"); - - b.Property("QRcode"); - - b.Property("SecurityStamp"); - - b.Property("TwoFactorEnabled"); - - b.Property("UserName") - .HasMaxLength(256); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasName("UserNameIndex"); - - b.ToTable("AspNetUsers"); - }); - - modelBuilder.Entity("api.Models.UserRole", b => - { - b.Property("UserId"); - - b.Property("RoleId"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles"); - }); - - modelBuilder.Entity("api.Models.Value", b => - { - b.Property("id") - .ValueGeneratedOnAdd(); - - b.Property("Name"); - - b.HasKey("id"); - - b.ToTable("Values"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("api.Models.Role") - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("api.Models.User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("api.Models.User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("api.Models.User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("api.Models.Photo", b => - { - b.HasOne("api.Models.User", "User") - .WithMany("Photos") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("api.Models.UserRole", b => - { - b.HasOne("api.Models.Role", "Role") - .WithMany("UserRoles") - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("api.Models.User", "User") - .WithMany("UserRoles") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/api/Migrations/20190223225342_team_event.cs b/api/Migrations/20190223225342_team_event.cs deleted file mode 100644 index 54f653db..00000000 --- a/api/Migrations/20190223225342_team_event.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -namespace api.Migrations -{ - public partial class team_event : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - - } - } -} diff --git a/api/Migrations/20190223225824_Teams_and_Events.Designer.cs b/api/Migrations/20190223225824_Teams_and_Events.Designer.cs deleted file mode 100644 index eadba6da..00000000 --- a/api/Migrations/20190223225824_Teams_and_Events.Designer.cs +++ /dev/null @@ -1,267 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using api.Data; - -namespace api.Migrations -{ - [DbContext(typeof(DataContext))] - [Migration("20190223225824_Teams_and_Events")] - partial class Teams_and_Events - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "2.2.0-rtm-35687") - .HasAnnotation("Relational:MaxIdentifierLength", 64); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ClaimType"); - - b.Property("ClaimValue"); - - b.Property("RoleId"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ClaimType"); - - b.Property("ClaimValue"); - - b.Property("UserId"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider"); - - b.Property("ProviderKey"); - - b.Property("ProviderDisplayName"); - - b.Property("UserId"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId"); - - b.Property("LoginProvider"); - - b.Property("Name"); - - b.Property("Value"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens"); - }); - - modelBuilder.Entity("api.Models.Photo", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("DateAdded"); - - b.Property("Description"); - - b.Property("IsMain"); - - b.Property("Url"); - - b.Property("UserId"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("Photos"); - }); - - modelBuilder.Entity("api.Models.Role", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken(); - - b.Property("Name") - .HasMaxLength(256); - - b.Property("NormalizedName") - .HasMaxLength(256); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasName("RoleNameIndex"); - - b.ToTable("AspNetRoles"); - }); - - modelBuilder.Entity("api.Models.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("AccessFailedCount"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken(); - - b.Property("Email") - .HasMaxLength(256); - - b.Property("EmailConfirmed"); - - b.Property("LockoutEnabled"); - - b.Property("LockoutEnd"); - - b.Property("NormalizedEmail") - .HasMaxLength(256); - - b.Property("NormalizedUserName") - .HasMaxLength(256); - - b.Property("PasswordHash"); - - b.Property("PhoneNumber"); - - b.Property("PhoneNumberConfirmed"); - - b.Property("QRcode"); - - b.Property("SecurityStamp"); - - b.Property("TwoFactorEnabled"); - - b.Property("UserName") - .HasMaxLength(256); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasName("UserNameIndex"); - - b.ToTable("AspNetUsers"); - }); - - modelBuilder.Entity("api.Models.UserRole", b => - { - b.Property("UserId"); - - b.Property("RoleId"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles"); - }); - - modelBuilder.Entity("api.Models.Value", b => - { - b.Property("id") - .ValueGeneratedOnAdd(); - - b.Property("Name"); - - b.HasKey("id"); - - b.ToTable("Values"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("api.Models.Role") - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("api.Models.User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("api.Models.User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("api.Models.User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("api.Models.Photo", b => - { - b.HasOne("api.Models.User", "User") - .WithMany("Photos") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("api.Models.UserRole", b => - { - b.HasOne("api.Models.Role", "Role") - .WithMany("UserRoles") - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("api.Models.User", "User") - .WithMany("UserRoles") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/api/Migrations/20190223225824_Teams_and_Events.cs b/api/Migrations/20190223225824_Teams_and_Events.cs deleted file mode 100644 index dc9066f2..00000000 --- a/api/Migrations/20190223225824_Teams_and_Events.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -namespace api.Migrations -{ - public partial class Teams_and_Events : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - - } - } -} diff --git a/api/Migrations/20190214194904_teste.Designer.cs b/api/Migrations/20190223232738_TeamsEvents.Designer.cs similarity index 78% rename from api/Migrations/20190214194904_teste.Designer.cs rename to api/Migrations/20190223232738_TeamsEvents.Designer.cs index 1d51f04f..ac20d2b6 100644 --- a/api/Migrations/20190214194904_teste.Designer.cs +++ b/api/Migrations/20190223232738_TeamsEvents.Designer.cs @@ -9,8 +9,8 @@ using api.Data; namespace api.Migrations { [DbContext(typeof(DataContext))] - [Migration("20190214194904_teste")] - partial class teste + [Migration("20190223232738_TeamsEvents")] + partial class TeamsEvents { protected override void BuildTargetModel(ModelBuilder modelBuilder) { @@ -87,28 +87,62 @@ namespace api.Migrations b.ToTable("AspNetUserTokens"); }); - modelBuilder.Entity("api.Models.EventQR", b => + modelBuilder.Entity("api.Models.Event", b => { b.Property("Id") .ValueGeneratedOnAdd(); - b.Property("Event"); + b.Property("Desc"); - b.Property("EventLocId"); - - b.Property("Pontos"); - - b.Property("QRData"); - - b.Property("TeamId"); - - b.Property("TimeGen"); + b.Property("Nome"); b.HasKey("Id"); + b.ToTable("Events"); + }); + + modelBuilder.Entity("api.Models.EventLoc", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Desc"); + + b.Property("EventId"); + + b.Property("ImgId"); + + b.Property("Lat"); + + b.Property("Long"); + + b.Property("Nome"); + + b.HasKey("Id"); + + b.HasIndex("ImgId"); + + b.ToTable("EventLocs"); + }); + + modelBuilder.Entity("api.Models.EventLocVisited", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("LocationId"); + + b.Property("TeamId"); + + b.Property("timestamp"); + + b.HasKey("Id"); + + b.HasIndex("LocationId"); + b.HasIndex("TeamId"); - b.ToTable("EventQR"); + b.ToTable("EventLocsVisited"); }); modelBuilder.Entity("api.Models.Photo", b => @@ -161,18 +195,22 @@ namespace api.Migrations b.Property("Id") .ValueGeneratedOnAdd(); - b.Property("Event"); + b.Property("CapId"); + + b.Property("EventId"); + + b.Property("NMembros"); b.Property("Nome"); - b.Property("NumMemb"); - b.Property("Pontos"); - b.Property("VisitedNum"); + b.Property("QRcode"); b.HasKey("Id"); + b.HasIndex("CapId"); + b.ToTable("Teams"); }); @@ -181,36 +219,16 @@ namespace api.Migrations b.Property("Id") .ValueGeneratedOnAdd(); - b.Property("About"); - b.Property("AccessFailedCount"); - b.Property("Adress"); - - b.Property("Age"); - - b.Property("City"); - - b.Property("Company"); - b.Property("ConcurrencyStamp") .IsConcurrencyToken(); - b.Property("Country"); - - b.Property("Degree"); - b.Property("Email") .HasMaxLength(256); b.Property("EmailConfirmed"); - b.Property("FullName"); - - b.Property("Gender"); - - b.Property("LastLogin"); - b.Property("LockoutEnabled"); b.Property("LockoutEnd"); @@ -223,37 +241,21 @@ namespace api.Migrations b.Property("PasswordHash"); - b.Property("Phone"); - b.Property("PhoneNumber"); b.Property("PhoneNumberConfirmed"); - b.Property("Position"); - - b.Property("ProfileIcon"); - b.Property("QRcode"); - b.Property("Registed"); - - b.Property("Role"); - - b.Property("SchoolYear"); - b.Property("SecurityStamp"); b.Property("TeamId"); b.Property("TwoFactorEnabled"); - b.Property("University"); - b.Property("UserName") .HasMaxLength(256); - b.Property("linkedIn"); - b.HasKey("Id"); b.HasIndex("NormalizedEmail") @@ -325,12 +327,22 @@ namespace api.Migrations .OnDelete(DeleteBehavior.Cascade); }); - modelBuilder.Entity("api.Models.EventQR", b => + modelBuilder.Entity("api.Models.EventLoc", b => { - b.HasOne("api.Models.Team") - .WithMany("QRs") - .HasForeignKey("TeamId") - .OnDelete(DeleteBehavior.Cascade); + b.HasOne("api.Models.Photo", "Img") + .WithMany() + .HasForeignKey("ImgId"); + }); + + modelBuilder.Entity("api.Models.EventLocVisited", b => + { + b.HasOne("api.Models.EventLoc", "Location") + .WithMany() + .HasForeignKey("LocationId"); + + b.HasOne("api.Models.Team", "Team") + .WithMany() + .HasForeignKey("TeamId"); }); modelBuilder.Entity("api.Models.Photo", b => @@ -341,10 +353,17 @@ namespace api.Migrations .OnDelete(DeleteBehavior.Cascade); }); + modelBuilder.Entity("api.Models.Team", b => + { + b.HasOne("api.Models.User", "Cap") + .WithMany() + .HasForeignKey("CapId"); + }); + modelBuilder.Entity("api.Models.User", b => { b.HasOne("api.Models.Team") - .WithMany("Users") + .WithMany("Membros") .HasForeignKey("TeamId"); }); diff --git a/api/Migrations/20190221000457_a.cs b/api/Migrations/20190223232738_TeamsEvents.cs similarity index 58% rename from api/Migrations/20190221000457_a.cs rename to api/Migrations/20190223232738_TeamsEvents.cs index b538d1ef..23f1b84e 100644 --- a/api/Migrations/20190221000457_a.cs +++ b/api/Migrations/20190223232738_TeamsEvents.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore.Migrations; namespace api.Migrations { - public partial class a : Migration + public partial class TeamsEvents : Migration { protected override void Up(MigrationBuilder migrationBuilder) { @@ -24,48 +24,17 @@ namespace api.Migrations }); migrationBuilder.CreateTable( - name: "AspNetUsers", + name: "Events", columns: table => new { Id = table.Column(nullable: false) .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), - UserName = table.Column(maxLength: 256, nullable: true), - NormalizedUserName = table.Column(maxLength: 256, nullable: true), - Email = table.Column(maxLength: 256, nullable: true), - NormalizedEmail = table.Column(maxLength: 256, nullable: true), - EmailConfirmed = table.Column(nullable: false), - PasswordHash = table.Column(nullable: true), - SecurityStamp = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), - PhoneNumber = table.Column(nullable: true), - PhoneNumberConfirmed = table.Column(nullable: false), - TwoFactorEnabled = table.Column(nullable: false), - LockoutEnd = table.Column(nullable: true), - LockoutEnabled = table.Column(nullable: false), - AccessFailedCount = table.Column(nullable: false), - FullName = table.Column(nullable: true), - Gender = table.Column(nullable: true), - Age = table.Column(nullable: false), - Phone = table.Column(nullable: false), - University = table.Column(nullable: true), - Adress = table.Column(nullable: true), - Country = table.Column(nullable: true), - City = table.Column(nullable: true), - linkedIn = table.Column(nullable: true), - LastLogin = table.Column(nullable: false), - Registed = table.Column(nullable: false), - QRcode = table.Column(nullable: true), - Role = table.Column(nullable: true), - Degree = table.Column(nullable: true), - SchoolYear = table.Column(nullable: false), - ProfileIcon = table.Column(nullable: true), - Company = table.Column(nullable: true), - Position = table.Column(nullable: true), - About = table.Column(nullable: true) + Nome = table.Column(nullable: true), + Desc = table.Column(nullable: true) }, constraints: table => { - table.PrimaryKey("PK_AspNetUsers", x => x.Id); + table.PrimaryKey("PK_Events", x => x.Id); }); migrationBuilder.CreateTable( @@ -102,47 +71,6 @@ namespace api.Migrations onDelete: ReferentialAction.Cascade); }); - migrationBuilder.CreateTable( - name: "AspNetUserClaims", - columns: table => new - { - Id = table.Column(nullable: false) - .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), - UserId = table.Column(nullable: false), - ClaimType = table.Column(nullable: true), - ClaimValue = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetUserClaims_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserLogins", - columns: table => new - { - LoginProvider = table.Column(nullable: false), - ProviderKey = table.Column(nullable: false), - ProviderDisplayName = table.Column(nullable: true), - UserId = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey }); - table.ForeignKey( - name: "FK_AspNetUserLogins_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - migrationBuilder.CreateTable( name: "AspNetUserRoles", columns: table => new @@ -159,12 +87,35 @@ namespace api.Migrations principalTable: "AspNetRoles", principalColumn: "Id", onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserClaims", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + UserId = table.Column(nullable: false), + ClaimType = table.Column(nullable: true), + ClaimValue = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserClaims", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserLogins", + columns: table => new + { + LoginProvider = table.Column(nullable: false), + ProviderKey = table.Column(nullable: false), + ProviderDisplayName = table.Column(nullable: true), + UserId = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey }); }); migrationBuilder.CreateTable( @@ -179,12 +130,6 @@ namespace api.Migrations constraints: table => { table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); - table.ForeignKey( - name: "FK_AspNetUserTokens_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( @@ -202,12 +147,109 @@ namespace api.Migrations constraints: table => { table.PrimaryKey("PK_Photos", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "EventLocs", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + EventId = table.Column(nullable: false), + Lat = table.Column(nullable: false), + Long = table.Column(nullable: false), + Nome = table.Column(nullable: true), + Desc = table.Column(nullable: true), + ImgId = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_EventLocs", x => x.Id); table.ForeignKey( - name: "FK_Photos_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", + name: "FK_EventLocs_Photos_ImgId", + column: x => x.ImgId, + principalTable: "Photos", principalColumn: "Id", - onDelete: ReferentialAction.Cascade); + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "Teams", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + QRcode = table.Column(nullable: true), + EventId = table.Column(nullable: false), + Nome = table.Column(nullable: true), + CapId = table.Column(nullable: true), + NMembros = table.Column(nullable: false), + Pontos = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Teams", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AspNetUsers", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + UserName = table.Column(maxLength: 256, nullable: true), + NormalizedUserName = table.Column(maxLength: 256, nullable: true), + Email = table.Column(maxLength: 256, nullable: true), + NormalizedEmail = table.Column(maxLength: 256, nullable: true), + EmailConfirmed = table.Column(nullable: false), + PasswordHash = table.Column(nullable: true), + SecurityStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(nullable: true), + PhoneNumber = table.Column(nullable: true), + PhoneNumberConfirmed = table.Column(nullable: false), + TwoFactorEnabled = table.Column(nullable: false), + LockoutEnd = table.Column(nullable: true), + LockoutEnabled = table.Column(nullable: false), + AccessFailedCount = table.Column(nullable: false), + QRcode = table.Column(nullable: true), + TeamId = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUsers", x => x.Id); + table.ForeignKey( + name: "FK_AspNetUsers_Teams_TeamId", + column: x => x.TeamId, + principalTable: "Teams", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "EventLocsVisited", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + TeamId = table.Column(nullable: true), + LocationId = table.Column(nullable: true), + timestamp = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_EventLocsVisited", x => x.Id); + table.ForeignKey( + name: "FK_EventLocsVisited_EventLocs_LocationId", + column: x => x.LocationId, + principalTable: "EventLocs", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + table.ForeignKey( + name: "FK_EventLocsVisited_Teams_TeamId", + column: x => x.TeamId, + principalTable: "Teams", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); }); migrationBuilder.CreateIndex( @@ -247,14 +289,91 @@ namespace api.Migrations column: "NormalizedUserName", unique: true); + migrationBuilder.CreateIndex( + name: "IX_AspNetUsers_TeamId", + table: "AspNetUsers", + column: "TeamId"); + + migrationBuilder.CreateIndex( + name: "IX_EventLocs_ImgId", + table: "EventLocs", + column: "ImgId"); + + migrationBuilder.CreateIndex( + name: "IX_EventLocsVisited_LocationId", + table: "EventLocsVisited", + column: "LocationId"); + + migrationBuilder.CreateIndex( + name: "IX_EventLocsVisited_TeamId", + table: "EventLocsVisited", + column: "TeamId"); + migrationBuilder.CreateIndex( name: "IX_Photos_UserId", table: "Photos", column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_Teams_CapId", + table: "Teams", + column: "CapId"); + + migrationBuilder.AddForeignKey( + name: "FK_AspNetUserRoles_AspNetUsers_UserId", + table: "AspNetUserRoles", + column: "UserId", + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_AspNetUserClaims_AspNetUsers_UserId", + table: "AspNetUserClaims", + column: "UserId", + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_AspNetUserLogins_AspNetUsers_UserId", + table: "AspNetUserLogins", + column: "UserId", + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_AspNetUserTokens_AspNetUsers_UserId", + table: "AspNetUserTokens", + column: "UserId", + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_Photos_AspNetUsers_UserId", + table: "Photos", + column: "UserId", + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_Teams_AspNetUsers_CapId", + table: "Teams", + column: "CapId", + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); } protected override void Down(MigrationBuilder migrationBuilder) { + migrationBuilder.DropForeignKey( + name: "FK_Teams_AspNetUsers_CapId", + table: "Teams"); + migrationBuilder.DropTable( name: "AspNetRoleClaims"); @@ -271,7 +390,10 @@ namespace api.Migrations name: "AspNetUserTokens"); migrationBuilder.DropTable( - name: "Photos"); + name: "EventLocsVisited"); + + migrationBuilder.DropTable( + name: "Events"); migrationBuilder.DropTable( name: "Values"); @@ -279,8 +401,17 @@ namespace api.Migrations migrationBuilder.DropTable( name: "AspNetRoles"); + migrationBuilder.DropTable( + name: "EventLocs"); + + migrationBuilder.DropTable( + name: "Photos"); + migrationBuilder.DropTable( name: "AspNetUsers"); + + migrationBuilder.DropTable( + name: "Teams"); } } } diff --git a/api/Migrations/DataContextModelSnapshot.cs b/api/Migrations/DataContextModelSnapshot.cs index be123977..6fc51361 100644 --- a/api/Migrations/DataContextModelSnapshot.cs +++ b/api/Migrations/DataContextModelSnapshot.cs @@ -85,6 +85,64 @@ namespace api.Migrations b.ToTable("AspNetUserTokens"); }); + modelBuilder.Entity("api.Models.Event", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Desc"); + + b.Property("Nome"); + + b.HasKey("Id"); + + b.ToTable("Events"); + }); + + modelBuilder.Entity("api.Models.EventLoc", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Desc"); + + b.Property("EventId"); + + b.Property("ImgId"); + + b.Property("Lat"); + + b.Property("Long"); + + b.Property("Nome"); + + b.HasKey("Id"); + + b.HasIndex("ImgId"); + + b.ToTable("EventLocs"); + }); + + modelBuilder.Entity("api.Models.EventLocVisited", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("LocationId"); + + b.Property("TeamId"); + + b.Property("timestamp"); + + b.HasKey("Id"); + + b.HasIndex("LocationId"); + + b.HasIndex("TeamId"); + + b.ToTable("EventLocsVisited"); + }); + modelBuilder.Entity("api.Models.Photo", b => { b.Property("Id") @@ -130,6 +188,30 @@ namespace api.Migrations b.ToTable("AspNetRoles"); }); + modelBuilder.Entity("api.Models.Team", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CapId"); + + b.Property("EventId"); + + b.Property("NMembros"); + + b.Property("Nome"); + + b.Property("Pontos"); + + b.Property("QRcode"); + + b.HasKey("Id"); + + b.HasIndex("CapId"); + + b.ToTable("Teams"); + }); + modelBuilder.Entity("api.Models.User", b => { b.Property("Id") @@ -165,6 +247,8 @@ namespace api.Migrations b.Property("SecurityStamp"); + b.Property("TeamId"); + b.Property("TwoFactorEnabled"); b.Property("UserName") @@ -179,6 +263,8 @@ namespace api.Migrations .IsUnique() .HasName("UserNameIndex"); + b.HasIndex("TeamId"); + b.ToTable("AspNetUsers"); }); @@ -239,6 +325,24 @@ namespace api.Migrations .OnDelete(DeleteBehavior.Cascade); }); + modelBuilder.Entity("api.Models.EventLoc", b => + { + b.HasOne("api.Models.Photo", "Img") + .WithMany() + .HasForeignKey("ImgId"); + }); + + modelBuilder.Entity("api.Models.EventLocVisited", b => + { + b.HasOne("api.Models.EventLoc", "Location") + .WithMany() + .HasForeignKey("LocationId"); + + b.HasOne("api.Models.Team", "Team") + .WithMany() + .HasForeignKey("TeamId"); + }); + modelBuilder.Entity("api.Models.Photo", b => { b.HasOne("api.Models.User", "User") @@ -247,6 +351,20 @@ namespace api.Migrations .OnDelete(DeleteBehavior.Cascade); }); + modelBuilder.Entity("api.Models.Team", b => + { + b.HasOne("api.Models.User", "Cap") + .WithMany() + .HasForeignKey("CapId"); + }); + + modelBuilder.Entity("api.Models.User", b => + { + b.HasOne("api.Models.Team") + .WithMany("Membros") + .HasForeignKey("TeamId"); + }); + modelBuilder.Entity("api.Models.UserRole", b => { b.HasOne("api.Models.Role", "Role") diff --git a/api/Models/Team.cs b/api/Models/Team.cs index 16c5f004..f029e0b9 100644 --- a/api/Models/Team.cs +++ b/api/Models/Team.cs @@ -6,6 +6,7 @@ namespace api.Models { public class Team { + public int Id{get;set;} //id public string QRcode{get;set;} //QR ID code public int EventId{get;set;} //equipa para o evento ID public string Nome{get;set;} //Nome da equipa From 7fc4063c46ef6c2cc200c363b7bb5fb4efc02728 Mon Sep 17 00:00:00 2001 From: ZMiguel Alves Date: Tue, 26 Feb 2019 00:41:17 +0000 Subject: [PATCH 05/22] Auto stash before merge of "zmiguel" and "origin/zmiguel" --- api/Controllers/TeamsController.cs | 44 +++++++++++++++++++ api/obj/Debug/netcoreapp2.1/api.assets.cache | Bin 133027 -> 133820 bytes 2 files changed, 44 insertions(+) create mode 100644 api/Controllers/TeamsController.cs diff --git a/api/Controllers/TeamsController.cs b/api/Controllers/TeamsController.cs new file mode 100644 index 00000000..e5598d92 --- /dev/null +++ b/api/Controllers/TeamsController.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using api.Data; +using api.Dtos; +using api.Models; +using AutoMapper; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; + +namespace api.Controllers +{ + + [Authorize] + [Route("api/[controller]")] + [ApiController] + public class TeamsController : ControllerBase + { + private readonly DataContext context; + private readonly IUsersRepository _repo; + private readonly IMapper _mapper; + private readonly RoleManager _roleManager; + private readonly UserManager _userManager; + public TeamsController(DataContext context,IUsersRepository repo, IMapper mapper,RoleManager roleManager,UserManager UserManager) + { + this.context = context; + _mapper = mapper; + _roleManager = roleManager; + _userManager = UserManager; + _repo = repo; + } + + // GET api/teams + [HttpGet] + public async Task GetTeams() + { + var values= await context.Values.ToListAsync(); + return Ok(values); + } + } +} diff --git a/api/obj/Debug/netcoreapp2.1/api.assets.cache b/api/obj/Debug/netcoreapp2.1/api.assets.cache index b5b8a63c31742137695f16d273d1e5110dcdbf97..5e8a8b3185bcbdacd1934bcab5c58d0f3ec13a5e 100755 GIT binary patch literal 133820 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 literal 133027 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 skU2c Date: Tue, 26 Feb 2019 01:52:05 +0000 Subject: [PATCH 06/22] Inicio Eventos e Equipas --- api/Controllers/AuthController.cs | 1 - api/Controllers/EventsController.cs | 50 +++++++++++++++++++ api/Controllers/TeamsController.cs | 5 +- api/Data/DataContext.cs | 42 ++++++++-------- api/Data/EventsRepository.cs | 34 +++++++++++++ api/Data/IEventsRepository.cs | 15 ++++++ api/Startup.cs | 1 + api/obj/Debug/netcoreapp2.1/api.assets.cache | Bin 133820 -> 133820 bytes 8 files changed, 124 insertions(+), 24 deletions(-) create mode 100644 api/Controllers/EventsController.cs create mode 100644 api/Data/EventsRepository.cs create mode 100644 api/Data/IEventsRepository.cs diff --git a/api/Controllers/AuthController.cs b/api/Controllers/AuthController.cs index 527fb2b2..94f95a04 100755 --- a/api/Controllers/AuthController.cs +++ b/api/Controllers/AuthController.cs @@ -28,7 +28,6 @@ namespace api.Controllers public UserManager _userManager { get; } public SignInManager _signInManager { get; } public IUsersRepository _repo { get; } - private readonly IMapper _mapper; private readonly RoleManager _roleManager; diff --git a/api/Controllers/EventsController.cs b/api/Controllers/EventsController.cs new file mode 100644 index 00000000..7383d0db --- /dev/null +++ b/api/Controllers/EventsController.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using api.Data; +using api.Dtos; +using api.Models; +using AutoMapper; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; + +namespace api.Controllers +{ + + [Authorize] + [Route("api/[controller]")] + [ApiController] + public class EventsController : ControllerBase + { + private readonly DataContext context; + private readonly IEventsRepository _repo; + private readonly IMapper _mapper; + public EventsController(DataContext context,IEventsRepository repo, IMapper mapper) + { + this.context = context; + _mapper = mapper; + _repo = repo; + } + + // GET api/events + // GET all events + [HttpGet] + public async Task GetEvents() + { + var Events = await _repo.GetEvents(); + return Ok(Events); + } + + // GET api/events/[id] + // GET events id x + [HttpGet("{id}")] + public async Task GetEvent(int id) + { + var Event = await _repo.GetEvent(id); + return Ok(Event); + } + } +} diff --git a/api/Controllers/TeamsController.cs b/api/Controllers/TeamsController.cs index e5598d92..6ed8fb1e 100644 --- a/api/Controllers/TeamsController.cs +++ b/api/Controllers/TeamsController.cs @@ -34,11 +34,12 @@ namespace api.Controllers } // GET api/teams + // GET all teams [HttpGet] public async Task GetTeams() { - var values= await context.Values.ToListAsync(); - return Ok(values); + var Teams = await context.Teams.ToArrayAsync(); + return Ok(Teams); } } } diff --git a/api/Data/DataContext.cs b/api/Data/DataContext.cs index 2b4d4713..e6ac56e1 100755 --- a/api/Data/DataContext.cs +++ b/api/Data/DataContext.cs @@ -5,8 +5,8 @@ using Microsoft.EntityFrameworkCore; namespace api.Data { - public class DataContext : IdentityDbContext, - UserRole,IdentityUserLogin,IdentityRoleClaim,IdentityUserToken> + public class DataContext : IdentityDbContext,UserRole,IdentityUserLogin, + IdentityRoleClaim,IdentityUserToken> { public DataContext(DbContextOptions options):base(options) { } @@ -24,31 +24,31 @@ namespace api.Data public DbSetLogs{get;set;} -public DbSetProducts{get;set;} + public DbSetProducts{get;set;} - protected override void OnModelCreating(ModelBuilder builder) - { - base.OnModelCreating(builder); + protected override void OnModelCreating(ModelBuilder builder) + { + base.OnModelCreating(builder); - //para o ef saber as relações - builder.Entity(userRole => - { - userRole.HasKey(ur=> new {ur.UserId, ur.RoleId}); + //para o ef saber as relações + builder.Entity(userRole => + { + userRole.HasKey(ur=> new {ur.UserId, ur.RoleId}); - userRole.HasOne( ur=>ur.Role) - .WithMany(r=>r.UserRoles) - .HasForeignKey(ur=> ur.RoleId) - .IsRequired(); + userRole.HasOne( ur=>ur.Role) + .WithMany(r=>r.UserRoles) + .HasForeignKey(ur=> ur.RoleId) + .IsRequired(); - userRole.HasOne( ur=>ur.User) - .WithMany(r=>r.UserRoles) - .HasForeignKey(ur=> ur.UserId) - .IsRequired(); - - }); - } + userRole.HasOne( ur=>ur.User) + .WithMany(r=>r.UserRoles) + .HasForeignKey(ur=> ur.UserId) + .IsRequired(); + + }); + } } } \ No newline at end of file diff --git a/api/Data/EventsRepository.cs b/api/Data/EventsRepository.cs new file mode 100644 index 00000000..a7fb28d8 --- /dev/null +++ b/api/Data/EventsRepository.cs @@ -0,0 +1,34 @@ +using System; +using System.Threading.Tasks; +using api.Models; +using api.Data; +using Microsoft.EntityFrameworkCore; +using System.Collections.Generic; + +namespace api.Data +{ + public class EventsRepository : IEventsRepository + { + public EventsRepository(DataContext context) + { + _context = context; + } + + public DataContext _context { get; } + + public async Task GetEvent(int id) + { + var Event = await _context.Events.FirstOrDefaultAsync(e=>e.Id == id); + + return Event; + } + + public async Task> GetEvents() + { + var Events = await _context.Events.ToListAsync(); + + return Events; + } + + } +} \ No newline at end of file diff --git a/api/Data/IEventsRepository.cs b/api/Data/IEventsRepository.cs new file mode 100644 index 00000000..79233e7f --- /dev/null +++ b/api/Data/IEventsRepository.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using api.Models; + +namespace api.Data +{ + public interface IEventsRepository + { + + Task> GetEvents(); + Task GetEvent(int id); + + + } +} \ No newline at end of file diff --git a/api/Startup.cs b/api/Startup.cs index 62aee96b..913485cf 100755 --- a/api/Startup.cs +++ b/api/Startup.cs @@ -45,6 +45,7 @@ namespace api services.AddAutoMapper(); services.AddScoped(); + services.AddScoped(); //define a connection string indicada em appsettings.json services.AddDbContext(x=>x.UseMySql(Configuration.GetConnectionString("DefaultConnection"))); diff --git a/api/obj/Debug/netcoreapp2.1/api.assets.cache b/api/obj/Debug/netcoreapp2.1/api.assets.cache index 5e8a8b3185bcbdacd1934bcab5c58d0f3ec13a5e..e445080c4a5d97600d8c6fc8c69d2dc856b3c451 100755 GIT binary patch delta 71 zcmV-N0J#6Wl?c3*2rW=cM?nGr000~;PWI~S0f}RK*r#b2Tx|*xG&gSbJ5NEK3+%rF dk^?l_0RRM-@JInWlMpKefoz3r0kv!bPzsH)7=i!* delta 71 zcmV-N0J#6Wl?c3*2rW=cM?nGr004EO3y`Zq5y}_NkoM1$<|x@vN!etcoE2jI|C7b% dX7V)J0RRM-@JInWlMpKefoz3r0kv!bPzpAJ9hm?C From 7634f1b65926f2c3bbdfde275c50506f5f5cb95f Mon Sep 17 00:00:00 2001 From: henrydays Date: Wed, 27 Feb 2019 11:22:43 +0000 Subject: [PATCH 07/22] novo update --- App/app/App.js | 10 +- App/app/screens/Home.js | 8 +- App/app/store/actions/api.js | 324 ++++++++++++++++++++++------------ App/app/store/reducers/api.js | 37 +++- website/index.html | 2 +- 5 files changed, 261 insertions(+), 120 deletions(-) diff --git a/App/app/App.js b/App/app/App.js index 44157fe4..e1f63f36 100755 --- a/App/app/App.js +++ b/App/app/App.js @@ -84,7 +84,8 @@ class App extends Component { username:'QR code', failedAttempt: false, push:4, - UI_loginScannerActive:false + UI_loginScannerActive:false, + userDetails:{username:'', password:''} }; @@ -107,7 +108,7 @@ class App extends Component { this.setState({isModalVisible: false}) //verifica se o utilizador tem token guardado - this.props.checkUser(); + this.props.checkUser(this.props.userDetails); this.keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', this._keyboardDidShow); this.keyboardDidHideListener = Keyboard.addListener('keyboardDidHide', this._keyboardDidHide); @@ -143,7 +144,7 @@ class App extends Component { render() { - if (!this.props.logged) { + if (!this.props.logged && this.props.onHold) { return ( @@ -530,7 +531,8 @@ mapStateToProps = (state, props) => { onHold: state.apiReducer.onHold, logged: state.apiReducer.logged, failedAttempt:state.apiReducer.failedAttempt, - UI_loginScannerActive: state.uiReducer.UI_loginScannerActive + UI_loginScannerActive: state.uiReducer.UI_loginScannerActive, + userDetails: state.apiReducer.userDetails, } }; diff --git a/App/app/screens/Home.js b/App/app/screens/Home.js index ce16bc7a..5f940078 100755 --- a/App/app/screens/Home.js +++ b/App/app/screens/Home.js @@ -60,7 +60,8 @@ class Home extends Component { token: {valid: false}, logged: true, onHold: true, - user: {Name: ''} + user: {Name: ''}, + userDetails:{} }; } handleConnectivityChange = () => { @@ -74,7 +75,7 @@ class Home extends Component { //console.log(this.props.token); - this.props.getUserInfo(this.props.token); + this.props.getUserInfo(this.props.userDetails.token); //console.log('logged:'+this.props.logged); @@ -342,7 +343,8 @@ function mapStateToProps(state, props) { token: state.apiReducer.token, user: state.apiReducer.user, - logged: state.apiReducer.logged + logged: state.apiReducer.logged, + userDetails: state.apiReducer.userDetails, } } diff --git a/App/app/store/actions/api.js b/App/app/store/actions/api.js index 4b399f9c..e24f7399 100644 --- a/App/app/store/actions/api.js +++ b/App/app/store/actions/api.js @@ -6,6 +6,7 @@ import { NetInfo } from 'react-native'; import { DATA_AVAILABLE, API_LOGIN, CHECK_USER, LOGOUT_USER, USER_INFO, HOLD, GET_EVENTS } from "./actionTypes" //Import the actions types constant we defined in our actions import moment from 'moment' +import { compose } from 'redux'; export const connectionState = (status) => { @@ -166,7 +167,8 @@ export function login(user, pass){ type: API_LOGIN, logged:false, failedAttempt:true, - token: obj + token: obj, + user:{Name:'Henrique'} }); } @@ -176,39 +178,16 @@ export function login(user, pass){ refreshToken:parsed.refresh_token, valid:true }; + + dispatch({ + type: API_LOGIN, + logged:true, + failedAttempt:false, + token:obj, + user:{Name:'Henrique'} - - - // deviceStorage.saveItem(parsed.access_token); - - saveToken(obj).then(a=>{ - - obj.valid=true; - - - dispatch({ - type: API_LOGIN, - logged:true, - failedAttempt:false, - token: obj - - }); - - }).catch(a=>{ - - console.log('error saving') - - obj.valid=false; - - dispatch({ - type: API_LOGIN, - logged:false, - failedAttempt:true, - token: obj - - - }); - }) + }); + } @@ -290,11 +269,209 @@ export function logoutUser(){ } // +function refreshToken(){ -export function checkUser(){ + refresh=a.refreshToken + + //chamar funçao para renovar + console.log("expirou") + + var details = { + + 'grant_type': 'refresh_token', + 'refresh_token':refresh + + }; + + var formBody = []; + + for (var property in details) { + + var encodedKey = encodeURIComponent(property); + + var encodedValue = encodeURIComponent(details[property]); + + formBody.push(encodedKey + "=" + encodedValue); + + } + + formBody = formBody.join("&"); + + fetch('http://enei2019.uingress.com/internal/api/token', { + + method: 'POST', + + headers: { + + 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' + }, + + body: formBody + + }).then(res=>res.json()).then(parsed=>{ + + console.log(parsed); + + if(parsed.error=='invalid_grant'){ + + console.log(formBody); + dispatch({type: CHECK_USER, token:'', logged:false, onHold:false}); + + }else{ + + var obj={ + access_token:parsed.access_token, + expirationDateToken:Math.round(new Date().getTime()/1000) + 3598, + refreshToken:parsed.refresh_token, + valid:true + + + }; + + // deleteToken(); + saveToken(obj).then(a=>{ + console.log("Token guardado" ) + console.log(obj) + dispatch({type: CHECK_USER, token:obj, logged:true, onHold:false}); + + }) + } + + + }).catch(a=>{ + console.log("erro na api") + dispatch({type: CHECK_USER, token:'', logged:false, onHold:false}); + }) + +} + + refreshLogin= async (user, pass)=>{ + + + console.log("login") + + + console.log('user: ' +user + ' password: '+pass ); + + var details = { + 'username': user, + 'password': pass, + 'grant_type': 'password' + }; + + var formBody = []; + + for (var property in details) { + + var encodedKey = encodeURIComponent(property); + + var encodedValue = encodeURIComponent(details[property]); + + formBody.push(encodedKey + "=" + encodedValue); + + } + + formBody = formBody.join("&"); + + fetch('http://enei2019.uingress.com/internal/api/token', { + + method: 'POST', + + headers: { + + 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' + }, + + body: formBody + + }).catch(err=>{ + + console.log(err); + + alert("error"); + + + }).then(res=>res.json()).then(parsed=>{ + + if(parsed.error_description=="Provided username and password is incorrect"){ + throw "error"; + } + var obj={ + access_token:parsed.access_token, + expirationDateToken:Math.round(new Date().getTime()/1000) + 3598, + refreshToken:parsed.refresh_token, + valid:true + }; + + + + return obj; + + + } + + ) + + + + + + + + + +} + +export function checkUser(userDetails){ return (dispatch)=>{ + //verifica se existe utilizador em memória + if(userDetails.username!=undefined && + userDetails.username!='' && + userDetails.password!=undefined && + userDetails.password!='' + ){ + + //verifica a validade do token + if(Math.round(new Date().getTime()/1000) >= userDetails.token.expirationDateToken){ + + //se tiver expirado + refreshLogin().then(a=>{ + + console.log("tentativa de relogin") + + var u= userDetails; + + dispatch({type: CHECK_USER, logged:true, onHold:false, user:{Name:'Henrique'}, userDetails:u}); + + }).catch(b=>{ + + console.log("error"); + + dispatch({type: CHECK_USER,logged:false, onHold:false}); + }) + + }else{ + console.log("chegou asui") + //dispatch home + dispatch({type: CHECK_USER, logged:false, onHold:false, user:{Name:'Henrique'}}); + + } + + + } + //utilizador não existe em memória + else{ + + dispatch({type: CHECK_USER,logged:false, onHold:false}); + //dispatch menu de login + } + + + +/* + getToken().then(a=>{ @@ -316,78 +493,10 @@ export function checkUser(){ //se expirar if(Math.round(new Date().getTime()/1000) >= a.expirationDateToken){ - refresh=a.refreshToken - - //chamar funçao para renovar - console.log("expirou") - - var details = { - - 'grant_type': 'refresh_token', - 'refresh_token':refresh - - }; - - var formBody = []; - - for (var property in details) { - - var encodedKey = encodeURIComponent(property); - - var encodedValue = encodeURIComponent(details[property]); - - formBody.push(encodedKey + "=" + encodedValue); - - } - - formBody = formBody.join("&"); - - fetch('http://enei2019.uingress.com/internal/api/token', { - - method: 'POST', - - headers: { - - 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' - }, - - body: formBody - - }).then(res=>res.json()).then(parsed=>{ - - console.log(parsed); - - if(parsed.error=='invalid_grant'){ - - console.log(formBody); - dispatch({type: CHECK_USER, token:'', logged:false, onHold:false}); - - }else{ - - var obj={ - access_token:parsed.access_token, - expirationDateToken:Math.round(new Date().getTime()/1000) + 3598, - refreshToken:parsed.refresh_token, - valid:true - - - }; - - // deleteToken(); - saveToken(obj).then(a=>{ - console.log("Token guardado" ) - console.log(obj) - dispatch({type: CHECK_USER, token:obj, logged:true, onHold:false}); - - }) - } - - - }).catch(a=>{ - console.log("erro na api") - dispatch({type: CHECK_USER, token:'', logged:false, onHold:false}); + refreshLogin(user, pass).then(a=>{ + console.log("refreseh") }) - + }else{ @@ -408,6 +517,5 @@ export function checkUser(){ dispatch({type: CHECK_USER,token:false, logged:false, user:''}); }) - - } -} \ No newline at end of file + */ + }} \ No newline at end of file diff --git a/App/app/store/reducers/api.js b/App/app/store/reducers/api.js index 302d3586..53525ded 100644 --- a/App/app/store/reducers/api.js +++ b/App/app/store/reducers/api.js @@ -1,7 +1,25 @@ import { DATA_AVAILABLE, API_LOGIN, CHECK_USER, LOGOUT_USER, USER_INFO, HOLD, GET_EVENTS } from "../actions/actionTypes" //Import the actions types constant we defined in our actions import { REHYDRATE } from 'redux-persist'; -let apiState= { isConnected:false, token:{valid:false}, tokenData:'error', logged:false, onHold:true,user:{}, events:[], failedAttempt:false} +let apiState= { + + isConnected:false, + token:{valid:false}, + tokenData:'error', + logged:false, + onHold:true,user:{}, + events:[], + failedAttempt:false, + userDetails:{ + username:'', + password:'', + token:{ + expirationDateToken:0, + access_token:'' + } + }, + +} const apiReducer = (state = apiState, action) => { @@ -13,7 +31,9 @@ const apiReducer = (state = apiState, action) => { // logged:false, //onHold:true, - user: action.payload.apiReducer.user + user: action.payload.apiReducer.user, + + userDetails:{token:{expirationDateToken:0, access_token:'',username:"", password:""}} }; case 'CHANGE_CONNECTION_STATUS': return Object.assign({}, state, { @@ -26,8 +46,17 @@ const apiReducer = (state = apiState, action) => { return state; case API_LOGIN: - - state=Object.assign({},state, { logged:action.logged, token:action.token, failedAttempt: action.failedAttempt, user:user}); + + + state=Object.assign({},state, { + logged:action.logged, + token:action.token, + failedAttempt: action.failedAttempt, + user:action.user, + userDetails: {token:action.token}, + + + }); return state; diff --git a/website/index.html b/website/index.html index 722cd09b..fbdd1e6b 100755 --- a/website/index.html +++ b/website/index.html @@ -168,7 +168,7 @@
  • - Quando é o programa vai estar disponível? + Quando é que o programa vai estar disponível?

    O programa vai sendo lançado nas próximas semanas de forma iterativa.

    From 1c4df5dee5c9d36d29dba385e7aa333eb4481b9e Mon Sep 17 00:00:00 2001 From: henrydays Date: Wed, 27 Feb 2019 21:55:25 +0000 Subject: [PATCH 08/22] local storage --- App/app/store/actions/api.js | 43 ++++++++++++++++++++--------------- App/app/store/reducers/api.js | 24 ++++++++++++------- 2 files changed, 41 insertions(+), 26 deletions(-) diff --git a/App/app/store/actions/api.js b/App/app/store/actions/api.js index e24f7399..c002f1e1 100644 --- a/App/app/store/actions/api.js +++ b/App/app/store/actions/api.js @@ -178,13 +178,18 @@ export function login(user, pass){ refreshToken:parsed.refresh_token, valid:true }; - + + var details={ + username:user, + password:pass + } dispatch({ type: API_LOGIN, logged:true, failedAttempt:false, token:obj, - user:{Name:'Henrique'} + user:{Name:'Henrique'}, + userDetails: details }); @@ -423,39 +428,41 @@ function refreshToken(){ } export function checkUser(userDetails){ - + var u= userDetails; return (dispatch)=>{ - + //verifica se existe utilizador em memória - if(userDetails.username!=undefined && - userDetails.username!='' && - userDetails.password!=undefined && - userDetails.password!='' - ){ - + if( + userDetails.username != undefined && + userDetails.username != '' && + userDetails.password != undefined && + userDetails.password != '' + + ){ + //verifica a validade do token if(Math.round(new Date().getTime()/1000) >= userDetails.token.expirationDateToken){ - + + //se tiver expirado refreshLogin().then(a=>{ - console.log("tentativa de relogin") + console.log("tentativa de relogin") - var u= userDetails; - dispatch({type: CHECK_USER, logged:true, onHold:false, user:{Name:'Henrique'}, userDetails:u}); }).catch(b=>{ console.log("error"); - dispatch({type: CHECK_USER,logged:false, onHold:false}); + dispatch({type: CHECK_USER,logged:false, onHold:false,userDetails:u}); }) }else{ - console.log("chegou asui") + console.log("Tempo restante token: "+ Math.round((userDetails.token.expirationDateToken-Math.round(new Date().getTime()/1000) )/60) +" Minutos"); + //dispatch home - dispatch({type: CHECK_USER, logged:false, onHold:false, user:{Name:'Henrique'}}); + dispatch({type: CHECK_USER, logged:true, onHold:false, user:{Name:'Henrique'},userDetails:u}); } @@ -464,7 +471,7 @@ export function checkUser(userDetails){ //utilizador não existe em memória else{ - dispatch({type: CHECK_USER,logged:false, onHold:false}); + dispatch({type: CHECK_USER,logged:false, onHold:false,userDetails:u}); //dispatch menu de login } diff --git a/App/app/store/reducers/api.js b/App/app/store/reducers/api.js index 53525ded..38eb248a 100644 --- a/App/app/store/reducers/api.js +++ b/App/app/store/reducers/api.js @@ -24,16 +24,24 @@ let apiState= { const apiReducer = (state = apiState, action) => { switch(action.type){ + case REHYDRATE: + console.log( action.payload) + return { - // ...state, - // logged:false, - //onHold:true, - - user: action.payload.apiReducer.user, - - userDetails:{token:{expirationDateToken:0, access_token:'',username:"", password:""}} + + user: action.payload.apiReducer.user, + + userDetails:{ + token:{ + expirationDateToken:action.payload.apiReducer.userDetails.token.expirationDateToken, + access_token:action.payload.apiReducer.userDetails.token.access_token, + + }, + username:action.payload.apiReducer.userDetails.username, + password:action.payload.apiReducer.userDetails.password + } }; case 'CHANGE_CONNECTION_STATUS': return Object.assign({}, state, { @@ -53,7 +61,7 @@ const apiReducer = (state = apiState, action) => { token:action.token, failedAttempt: action.failedAttempt, user:action.user, - userDetails: {token:action.token}, + userDetails: {token:action.token, username:action.userDetails.username, password:action.userDetails.password}, }); From e36614b55f7f553887b4750db65da83450d85f76 Mon Sep 17 00:00:00 2001 From: henrydays Date: Thu, 28 Feb 2019 23:52:58 +0000 Subject: [PATCH 09/22] =?UTF-8?q?calend=C3=A1rio=20update?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/android/app/build.gradle | 1 + .../main/java/com/app/MainApplication.java | 2 + App/android/settings.gradle | 2 + App/app/App.js | 30 ++- App/app/screens/Home.js | 35 ++- App/app/screens/choosePath.js | 13 +- App/app/store/actions/actionTypes.js | 2 +- App/app/store/actions/api.js | 255 +++++++++++------- App/app/store/actions/index.js | 2 +- App/app/store/reducers/api.js | 39 ++- App/ios/app.xcodeproj/project.pbxproj | 29 +- App/package-lock.json | 10 + App/package.json | 3 + 13 files changed, 286 insertions(+), 137 deletions(-) diff --git a/App/android/app/build.gradle b/App/android/app/build.gradle index a1922356..2b2f7adc 100755 --- a/App/android/app/build.gradle +++ b/App/android/app/build.gradle @@ -149,6 +149,7 @@ android { } dependencies { + compile project(':react-native-device-info') compile project(':react-native-material-shadows') compile project(':react-native-linear-gradient') compile project(':react-native-camera') diff --git a/App/android/app/src/main/java/com/app/MainApplication.java b/App/android/app/src/main/java/com/app/MainApplication.java index 4333e258..8b11f16a 100755 --- a/App/android/app/src/main/java/com/app/MainApplication.java +++ b/App/android/app/src/main/java/com/app/MainApplication.java @@ -3,6 +3,7 @@ package com.app; import android.app.Application; import com.facebook.react.ReactApplication; +import com.learnium.RNDeviceInfo.RNDeviceInfo; import ui.materialshadows.RNMaterialShadowsPackage; import com.BV.LinearGradient.LinearGradientPackage; import org.reactnative.camera.RNCameraPackage; @@ -28,6 +29,7 @@ public class MainApplication extends Application implements ReactApplication { protected List getPackages() { return Arrays.asList( new MainReactPackage(), + new RNDeviceInfo(), new RNMaterialShadowsPackage(), new LinearGradientPackage(), new RNCameraPackage(), diff --git a/App/android/settings.gradle b/App/android/settings.gradle index 1993962a..7c9cafb3 100755 --- a/App/android/settings.gradle +++ b/App/android/settings.gradle @@ -1,4 +1,6 @@ rootProject.name = 'app' +include ':react-native-device-info' +project(':react-native-device-info').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-device-info/android') include ':react-native-material-shadows' project(':react-native-material-shadows').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-material-shadows/android') include ':react-native-linear-gradient' diff --git a/App/app/App.js b/App/app/App.js index e1f63f36..b4f401ee 100755 --- a/App/app/App.js +++ b/App/app/App.js @@ -40,12 +40,16 @@ const SCREEN_HEIGHT = Dimensions.get("window").height; const SCREEN_WIDTH = Dimensions.get("window").width; import Swiper from 'react-native-swiper'; +var TimerMixin = require('react-timer-mixin'); function handleConnectivityChange() { console.log("asdasd"); } + class App extends Component { - + handleConnectivityChange = isConnected => { + this.setState({ isConnected }); + } _activate=()=>{ this.setState({ isModalVisible: !this.state.isModalVisible}); @@ -85,8 +89,8 @@ class App extends Component { failedAttempt: false, push:4, UI_loginScannerActive:false, - userDetails:{username:'', password:''} - + userDetails:{username:'', password:''}, + isConnected: true }; } @@ -103,8 +107,8 @@ class App extends Component { componentDidMount() { - - NetInfo.isConnected.addEventListener('connectionChange', this.handleConnectivityChange); + this.props.hold(); + NetInfo.isConnected.addEventListener('connectionChange', this.handleConnectivityChange); this.setState({isModalVisible: false}) //verifica se o utilizador tem token guardado @@ -115,7 +119,7 @@ class App extends Component { } componentWillUnmount() { - NetInfo.isConnected.removeEventListener('connectionChange', this.handleConnectivityChange); + NetInfo.isConnected.removeEventListener('connectionChange', this.handleConnectivityChange); } _keyboardDidShow () { @@ -131,9 +135,9 @@ class App extends Component { } onSuccess = (e) => { - // this.setState({ isModalVisible: !this.state.isModalVisible }); - // this.props.login(e.data, 'f8908cc0'); - this.props.closeLoginQRScan(); + // this.setState({ isModalVisible: !this.state.isModalVisible }); + // this.props.login(e.data, 'f8908cc0'); + this.props.closeLoginQRScan(); this.setState({username:e.data}) console.log("QR code lido"); @@ -143,7 +147,13 @@ class App extends Component { }; render() { - + if (!this.state.isConnected) { + return ( + + cenas da vida + + ); + } if (!this.props.logged && this.props.onHold) { diff --git a/App/app/screens/Home.js b/App/app/screens/Home.js index 5f940078..95c6f34c 100755 --- a/App/app/screens/Home.js +++ b/App/app/screens/Home.js @@ -11,7 +11,8 @@ import { StyleSheet, Image, ImageBackground, - NetInfo + NetInfo, + AppState } from 'react-native'; import {Shadow} from 'react-native-shadow' @@ -38,10 +39,14 @@ const SCREEN_WIDTH = Dimensions.get("window").width; import {Card, Divider} from 'react-native-elements' import RNMaterialShadows from 'react-native-material-shadows'; - + + class Home extends Component { - + _handleConnectionChange = (isConnected) => { + // this.props.dispatch(connectionState({ status: isConnected })); + console.log("fck that") + }; _refresh() { return new Promise((resolve) => { setTimeout(()=>{resolve()}, 2000) @@ -61,21 +66,26 @@ class Home extends Component { logged: true, onHold: true, user: {Name: ''}, - userDetails:{} + userDetails:{}, + appState: AppState.currentState, }; } - handleConnectivityChange = () => { + handleConnectivityChange = () => { console.log("asdasdasdasdasd"); } - componentDidMount() { - NetInfo.isConnected.addEventListener('connectionChange', this.handleConnectivityChange); - this.props.hold(); + componentDidMount() { + + // NetInfo.isConnected.addEventListener('connectionChange', this.handleConnectivityChange); + + // this.props.hold(); + console.log("hold"+ this.props.onHold) //this.props.logoutUser(); //console.log(this.props.token); - this.props.getUserInfo(this.props.userDetails.token); + + // this.props.getUserInfo(this.props.userDetails.token); //console.log('logged:'+this.props.logged); @@ -86,7 +96,7 @@ class Home extends Component { } componentWillUnmount() { - NetInfo.isConnected.removeEventListener('connectionChange', this.handleConnectivityChange); + } bClick() { @@ -102,8 +112,8 @@ class Home extends Component { //var navigate = this.props.navigation.navigate } _update=()=>{ - if(this.props.token!= undefined) - this.props.getUserInfo(this.props.token); + + this.props.getUserInfo(this.props.userDetails.token); } @@ -345,6 +355,7 @@ function mapStateToProps(state, props) { user: state.apiReducer.user, logged: state.apiReducer.logged, userDetails: state.apiReducer.userDetails, + onHold: state.apiReducer.onHold } } diff --git a/App/app/screens/choosePath.js b/App/app/screens/choosePath.js index 4649b315..cf937535 100644 --- a/App/app/screens/choosePath.js +++ b/App/app/screens/choosePath.js @@ -79,7 +79,9 @@ class choosePath extends React.Component { ] } - + getCareerPaths=()=>{ + this.props.getAvailableGuestlists(this.props.userDetails.token) + } render() { let data = [{ value: 'Desenvolvimento Web', @@ -90,12 +92,15 @@ class choosePath extends React.Component { }]; return ( - + + + +