Merge pull request #3 from GCMatters/EventEndpoints

Various endpoint enhancements and fixes
This commit is contained in:
2025-05-18 17:40:55 +00:00
committed by GitHub
40 changed files with 1677 additions and 2180 deletions

View File

@@ -6,7 +6,6 @@ namespace WebApp.DTOs;
// Input values in JSON file to create event // Input values in JSON file to create event
public record class EventCreateDto public record class EventCreateDto
( (
[Required] int? OrganisationId,
[Required][StringLength(50)] string Title, [Required][StringLength(50)] string Title,
[StringLength(500)] string Description, [StringLength(500)] string Description,
[Required][StringLength(100)] string Location, [Required][StringLength(100)] string Location,

View File

@@ -0,0 +1,16 @@
using System.ComponentModel.DataAnnotations;
using WebApp.Entities;
namespace WebApp.DTOs;
// Input values in JSON file
public record class EventSearchDto
(
int? OrganisationId,
string? Title,
string? Description,
string? Location,
DateTime? EventDate,
ICollection<EventSkill>? EventSkills, // obecnie nie dotyczy
ICollection<EventRegistration>? EventRegistrations // obecnie nie dotyczy
);

View File

@@ -7,6 +7,7 @@ namespace WebApp.DTOs;
public record class EventSummaryDto( public record class EventSummaryDto(
int EventId, int EventId,
[Required] string Organisation, [Required] string Organisation,
[Required] int OrganisationId,
[Required] [StringLength(50)] string Title, [Required] [StringLength(50)] string Title,
[StringLength(500)] string Description, [StringLength(500)] string Description,
[Required] [StringLength(100)] string Location, [Required] [StringLength(100)] string Location,

View File

@@ -0,0 +1,16 @@
using System.ComponentModel.DataAnnotations;
using WebApp.Entities;
namespace WebApp.DTOs;
// Output values in JSON file
public record class EventSummaryNoErDto(
int EventId,
[Required] string Organisation,
[Required] int OrganisationId,
[Required][StringLength(50)] string Title,
[StringLength(500)] string Description,
[Required][StringLength(100)] string Location,
[Required] DateTime? EventDate,
ICollection<EventSkill> EventSkills
);

View File

@@ -6,7 +6,6 @@ namespace WebApp.DTOs;
// Input values in JSON file to update event // Input values in JSON file to update event
public record class EventUpdateDto public record class EventUpdateDto
( (
[Required] int? OrganisationId,
[Required][StringLength(50)] string Title, [Required][StringLength(50)] string Title,
[StringLength(500)] string Description, [StringLength(500)] string Description,
[Required][StringLength(100)] string Location, [Required][StringLength(100)] string Location,

9
WebApp/DTOs/LoginDto.cs Normal file
View File

@@ -0,0 +1,9 @@
using System.ComponentModel.DataAnnotations;
namespace WebApp.DTOs;
public record class LoginDto
(
[Required] string Email,
[Required] string Password
);

View File

@@ -0,0 +1,11 @@
using System.ComponentModel.DataAnnotations;
using WebApp.Entities;
namespace WebApp.DTOs;
public record class OrganisationSummaryDto
(
[Required] int? OrganisationId,
[Required][StringLength(50)] string Name,
[StringLength(500)] string Description,
[Required][StringLength(200)] string Website
);

View File

@@ -0,0 +1,14 @@
using System.ComponentModel.DataAnnotations;
namespace WebApp.DTOs
{
public record class UserSummaryDto
(
[Required] int UserId,
[Required] string Email,
[Required] string FirstName,
[Required] string LastName,
[Required] DateTime CreatedAt,
[Required] bool isOrganisation
);
}

View File

@@ -5,19 +5,23 @@ using WebApp.Entities;
namespace WebApp.Data namespace WebApp.Data
{ {
public class ApplicationDbContext : IdentityDbContext<User, IdentityRole<string>, string> public class ApplicationDbContext : IdentityDbContext//<User, IdentityRole<string>, string>
{ {
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options) : base(options)
{ {
} }
public DbSet<User> WebUsers => Set<User>();
public DbSet<Token> Tokens => Set<Token>();
public DbSet<Organisation> Organisations => Set<Organisation>(); public DbSet<Organisation> Organisations => Set<Organisation>();
public DbSet<Event> Events => Set<Event>(); public DbSet<Event> Events => Set<Event>();
public DbSet<Skill> Skills => Set<Skill>(); public DbSet<Skill> Skills => Set<Skill>();
public DbSet<VolunteerSkill> VolunteerSkills => Set<VolunteerSkill>(); public DbSet<VolunteerSkill> VolunteerSkills => Set<VolunteerSkill>();
public DbSet<EventSkill> EventSkills => Set<EventSkill>(); public DbSet<EventSkill> EventSkills => Set<EventSkill>();
public DbSet<EventRegistration> EventRegistrations => Set<EventRegistration>(); public DbSet<EventRegistration> EventRegistrations => Set<EventRegistration>();
public DbSet<Message> Messages => Set<Message>();
public DbSet<MessageActivity> MessagesActivities => Set<MessageActivity>();
protected override void OnModelCreating(ModelBuilder builder) protected override void OnModelCreating(ModelBuilder builder)
{ {
@@ -31,7 +35,10 @@ namespace WebApp.Data
.HasKey(es => new { es.EventId, es.SkillId }); .HasKey(es => new { es.EventId, es.SkillId });
builder.Entity<EventRegistration>() builder.Entity<EventRegistration>()
.HasKey(er => new { er.UserId, er.EventId }); .HasKey(er => new { er.VolunteerId, er.EventId });
builder.Entity<MessageActivity>()
.HasKey(ma => new { ma.Sender, ma.Recipient });
} }
} }
} }

View File

@@ -0,0 +1,138 @@
using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.EntityFrameworkCore;
using System.Security.Cryptography;
using System.Text;
using WebApp.Data;
using WebApp.DTOs;
using WebApp.Entities;
using WebApp.Mapping;
namespace WebApp.Endpoints
{
public static class AuthEndpoints
{
public static RouteGroupBuilder MapAuthEndpoints(this WebApplication app)
{
const string GetUserEndpointName = "GetUser";
var group = app.MapGroup("api/auth")
.WithParameterValidation();
group.MapPost("/login", async (LoginDto dto, ApplicationDbContext context, GeneralUseHelpers guh) =>
{
var user = await context.WebUsers.FirstOrDefaultAsync(u => u.Email == dto.Email);
string hashedPassword = HashPasswordSHA512(dto.Password);
if (user == null || user.Password != hashedPassword)
{
return Results.Json(new { message = "Wrong email or password." }, statusCode: 401);
}
var token = await guh.CreateNewToken(user.UserId);
return Results.Ok(new
{
message = "Login successful.",
token = token.Value
});
});
group.MapPost("/logout", async (HttpContext httpContext, GeneralUseHelpers guh) =>
{
var token = await guh.GetTokenFromHTTPContext(httpContext);
if (token == null)
{
return Results.Json(new { message = "No valid token found." }, statusCode: 401);
}
await guh.DeleteToken(token);
httpContext.Response.Cookies.Delete("token");
return Results.Ok(new { success = true });
});
group.MapGet("/my_account", async (HttpContext httpContext, GeneralUseHelpers guh) =>
{
var token = await guh.GetTokenFromHTTPContext(httpContext);
if(token == null)
{
return Results.Json(new { message = "No valid token found." }, statusCode: 401);
}
User? user = await guh.GetUserFromToken(token);
if(user == null)
{
return Results.Json(new {message = "No user found."}, statusCode: 404);
}
return Results.Ok(user.ToUserSummaryDto());
})
.WithName(GetUserEndpointName);
group.MapGet("/my_events", async (HttpContext httpContext, GeneralUseHelpers guh, ApplicationDbContext context) =>
{
var token = await guh.GetTokenFromHTTPContext(httpContext);
if (token == null)
{
return Results.Json(new { message = "No valid token found." }, statusCode: 401);
}
User? user = await guh.GetUserFromToken(token);
if (user == null)
{
return Results.Json(new { message = "No user found." }, statusCode: 404);
}
if(!user.IsOrganisation)
{
var events = await context.EventRegistrations
.Where(er => er.VolunteerId == user.UserId)
.Select(er => er.Event.ToEventSummaryNoErDto())
.ToListAsync();
return Results.Ok(events);
}
else
{
var org = await context.Organisations.FirstOrDefaultAsync(o => o.UserId == user.UserId);
if(org == null)
{
return Results.Json(new { message = "No organisation found for this user." }, statusCode: 404);
}
var events = await context.Events
.Where(e => e.OrganisationId == org.OrganisationId)
.Select(e => e.ToEventSummaryDto())
.ToListAsync();
return Results.Ok(events);
}
});
return group;
}
static string HashPasswordSHA512(string password)
{
using (var sha512 = SHA512.Create())
{
byte[] bytes = Encoding.ASCII.GetBytes(password);
byte[] hash = sha512.ComputeHash(bytes);
string hashstring = BitConverter.ToString(hash).Replace("-", "").ToLower();
return hashstring;
}
}
}
}

View File

@@ -1,4 +1,5 @@
using Microsoft.EntityFrameworkCore; using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using WebApp.Data; using WebApp.Data;
using WebApp.DTOs; using WebApp.DTOs;
using WebApp.Entities; using WebApp.Entities;
@@ -8,7 +9,7 @@ namespace WebApp.Endpoints
{ {
public static class EventsEndpoints public static class EventsEndpoints
{ {
const string GetEventEndpointName = "GetEvent"; const string GetEventEndpointName = "GetEvent";
public static RouteGroupBuilder MapEventsEndpoints(this WebApplication app) public static RouteGroupBuilder MapEventsEndpoints(this WebApplication app)
{ {
@@ -16,7 +17,8 @@ namespace WebApp.Endpoints
.WithParameterValidation(); .WithParameterValidation();
// GET /events // GET /events
group.MapGet("/", async (ApplicationDbContext dbContext) => group.MapGet("/",
async (ApplicationDbContext dbContext, HttpContext httpContext) =>
await dbContext.Events await dbContext.Events
.Include(Eve => Eve.Organisation) .Include(Eve => Eve.Organisation)
.OrderByDescending(Eve => Eve.EventId) .OrderByDescending(Eve => Eve.EventId)
@@ -25,36 +27,40 @@ namespace WebApp.Endpoints
.ToListAsync()); .ToListAsync());
// GET /events/1 // GET /events/1
group.MapGet("/{id}", async (int id, ApplicationDbContext dbContext) => group.MapGet("/{id}",
async (int id, ApplicationDbContext dbContext, HttpContext httpContext, GeneralUseHelpers guhf) =>
{ {
Event? Eve = await dbContext.Events.FindAsync(id); Event? Eve = await dbContext.Events.FindAsync(id);
if (Eve is null) return Results.NotFound(); if (Eve is null) return Results.NotFound();
// Sprawdź, czy token należy do organizacji, a jeżeli tak, to do której. // Sprawdź, czy token należy do organizacji, a jeżeli tak, to do której.
// ... Token? token = await guhf.GetTokenFromHTTPContext(httpContext);
Organisation? org = await guhf.GetOrganisationFromToken(token);
// Jeśli token należy do organizacji, która utworzyła to wydarzenie, // Jeśli token należy do organizacji, która utworzyła to wydarzenie,
// to zwróć także EventRegistrations. W przeciwnym razie usuń to pole // to zwróć także EventRegistrations. W przeciwnym razie usuń to pole
// przed jego wysłaniem! // przed jego wysłaniem!
// ... if (org is null || org.OrganisationId != Eve.OrganisationId) Eve.EventRegistrations = [];
EventDetailsDto EveDto = Eve.ToEventDetailsDto();
return Results.Ok(Eve.ToEventDetailsDto()); //EventDetailsDto return Results.Ok(EveDto); //EventDetailsDto
}) })
.WithName(GetEventEndpointName); .WithName(GetEventEndpointName);
// POST /events // POST /events
group.MapPost("/", async (EventCreateDto newEvent, ApplicationDbContext dbContext) => group.MapPost("/",
async (EventCreateDto newEvent, ApplicationDbContext dbContext, HttpContext httpContext, GeneralUseHelpers guhf) =>
{ {
// Uzyskaj organizację z tokenu // Uzyskaj organizację z tokenu
// ... Token? token = await guhf.GetTokenFromHTTPContext(httpContext);
Organisation? org = await guhf.GetOrganisationFromToken(token);
if (org is null) return Results.Unauthorized();
// dodajemy id organizacji z tokenu
Event Eve = newEvent.ToEntity(); Event Eve = newEvent.ToEntity();
Eve.OrganisationId = org.OrganisationId;
// Wyzeruj EventRegistrations, ponieważ nie są to dane,
// które powinniśmy przyjmować bez zgody wolontariuszy!
// ...
dbContext.Events.Add(Eve); dbContext.Events.Add(Eve);
await dbContext.SaveChangesAsync(); await dbContext.SaveChangesAsync();
@@ -66,30 +72,30 @@ namespace WebApp.Endpoints
}); });
// PUT /events/1 // PUT /events/1
group.MapPut("/{id}", async (int id, EventUpdateDto updatedEvent, ApplicationDbContext dbContext) => group.MapPut("/{id}",
async (int id, EventUpdateDto updatedEvent, ApplicationDbContext dbContext, GeneralUseHelpers guhf, HttpContext httpContext) =>
{ {
var existingEvent = await dbContext.Events.FindAsync(id); // Uzyskaj organizację z tokenu
Token? token = await guhf.GetTokenFromHTTPContext(httpContext);
Organisation? org = await guhf.GetOrganisationFromToken(token);
if (org is null) return Results.Unauthorized();
Console.Write(org.OrganisationId);
var existingEvent = await dbContext.Events.FindAsync(id);
if (existingEvent is null) if (existingEvent is null)
{ {
return Results.NotFound(); return Results.NotFound();
} }
// Uzyskaj organizację z tokenu
// ...
// Sprawdź, czy organizacja ma prawo // Sprawdź, czy organizacja ma prawo
// do zmodyfikowania tego (EventId = id) eventu. // do zmodyfikowania tego (EventId = id) eventu.
// ... if (org.OrganisationId != existingEvent.OrganisationId) return Results.StatusCode(403);
// Nadpisz organisationId (obecne w updatedEvent,
// lecz nie sprawdzane poniżej) na to, co odczytaliśmy
// do existingEvent.
// ...
var originalOrgId = existingEvent.OrganisationId;
dbContext.Entry(existingEvent) dbContext.Entry(existingEvent)
.CurrentValues .CurrentValues
.SetValues(updatedEvent.ToEntity(id)); .SetValues(updatedEvent.ToEntity(id));
existingEvent.OrganisationId = originalOrgId;
dbContext.Entry(existingEvent) dbContext.Entry(existingEvent)
.Collection(Eve => Eve.EventRegistrations) .Collection(Eve => Eve.EventRegistrations)
@@ -101,15 +107,20 @@ namespace WebApp.Endpoints
}); });
// DELETE /events/1 // DELETE /events/1
group.MapDelete("/{id}", async (int id, ApplicationDbContext dbContext) => group.MapDelete("/{id}",
async (int id, ApplicationDbContext dbContext, GeneralUseHelpers guhf, HttpContext httpContext) =>
{ {
// Uzyskaj organizację z tokenu // Uzyskaj organizację z tokenu
// ... Token? token = await guhf.GetTokenFromHTTPContext(httpContext);
Organisation? org = await guhf.GetOrganisationFromToken(token);
if (org is null) return Results.StatusCode(403);
// Sprawdź, czy organizacja ma prawo // Sprawdź, czy organizacja ma prawo
// do usunięcia tego (EventId = id) eventu. // do usunięcia tego (EventId = id) eventu.
// ... Event? Eve = await dbContext.Events.FindAsync(id);
if (Eve is null) return Results.NotFound();
else if (org.OrganisationId != Eve.OrganisationId) return Results.StatusCode(403);
await dbContext.Events await dbContext.Events
.Where(Eve => Eve.EventId == id) .Where(Eve => Eve.EventId == id)
@@ -118,6 +129,46 @@ namespace WebApp.Endpoints
return Results.NoContent(); return Results.NoContent();
}); });
// POST /events/search
group.MapPost("/search/",
async (EventSearchDto query, ApplicationDbContext dbContext, HttpContext httpContext, GeneralUseHelpers guhf) =>
{
// Uzyskaj organizację z tokenu
Token? token = await guhf.GetTokenFromHTTPContext(httpContext);
Organisation? org = await guhf.GetOrganisationFromToken(token);
List<EventSummaryDto> SearchResults = [];
List<Event> AllEvents = await dbContext.Events.ToListAsync();
foreach(Event e in AllEvents)
{
// Logika wyszukiwania
// Sprawdź wszystkie pola z EventSearchDto, np.
if (query.OrganisationId is not null)
{
// Sprawdź, czy Event należy do query.OrganisationId.
}
// ...
// Jeśli Event jest tym, czego szuka użytkownik,
// dodaj go do listy SearchResults.
//
// Uwaga! Zanim to zrobisz, sprawdź, czy użytkownik
// jest twórcą danego wydarzenia! Jeżeli nim nie jest,
// wyzeruj EventRegistrations!
if (org is null || e.Organisation != org)
{
e.EventRegistrations.Clear();
}
SearchResults.Add(e.ToEventSummaryDto());
}
return Results.Ok(SearchResults);
});
return group; return group;
} }
} }

View File

@@ -0,0 +1,90 @@
using Microsoft.EntityFrameworkCore;
using WebApp.Data;
using WebApp.Entities;
namespace WebApp.Endpoints;
public class GeneralUseHelpers
{
private readonly ApplicationDbContext _context;
public GeneralUseHelpers(ApplicationDbContext context)
{
_context = context;
}
async public Task<Token?> FindTokenFromString(string token_str)
{
// foreach (Token t in _context.Tokens) if (t.Value == token) return t;
// return null;
return await _context.Tokens.FirstOrDefaultAsync(t => t.Value == token_str);
}
async public Task<User?> GetUserFromToken(Token? t)
{
// Zwróci null, gdy nie znaleziono użytkownika
if (t is null) return null;
User? user = await _context.WebUsers.FindAsync(t.UserId);
return user;
}
async public Task<Organisation?> GetOrganisationFromToken(Token? t)
{
User? user = await GetUserFromToken(t);
if (user is not null && user.IsOrganisation)
{
Organisation? org = await _context.Organisations.FirstOrDefaultAsync(o => o.UserId == t.UserId);
if (org is null)
{
Console.WriteLine("!!!");
}
return org;
}
else return null;
}
public string? GetTokenStrFromHTTPContext(HttpContext httpContext)
{
var cookies = httpContext.Request.Cookies;
string? token = cookies["token"];
return token;
}
async public Task<Token?> GetTokenFromHTTPContext(HttpContext httpContext)
{
var cookies = httpContext.Request.Cookies;
string? token_str = cookies["token"];
if (token_str is not null)
{
Token? token = await FindTokenFromString(token_str);
if (token is not null) return token;
}
return null;
}
public async Task<Token> CreateNewToken(int userId)
{
var token = new Token
{
UserId = userId,
Value = "lah-" + Guid.NewGuid().ToString(),
ValidUntil = DateTime.UtcNow.AddDays(7)
};
_context.Tokens.Add(token);
await _context.SaveChangesAsync();
return token;
}
public async Task DeleteToken(Token token)
{
_context.Tokens.Remove(token);
await _context.SaveChangesAsync();
}
}

View File

@@ -0,0 +1,42 @@
using Microsoft.EntityFrameworkCore;
using WebApp.Data;
using WebApp.Entities;
using WebApp.Mapping;
namespace WebApp.Endpoints;
public static class OrganizationsEndpoints
{
const string GetOrganizationEndpointName = "GetOrganization";
public static RouteGroupBuilder MapOrganizationsEndpoints(this WebApplication app)
{
var group = app.MapGroup("api/organizations")
.WithParameterValidation();
// GET /organizations
group.MapGet("/",
async (ApplicationDbContext dbContext, HttpContext httpContext) =>
await dbContext.Organisations
//.Include(Eve => Eve.Organisation)
.OrderByDescending(Org => Org.OrganisationId)
.Select(Org => Org.ToOrgSummaryDto()) //OrgSummaryDto
.AsNoTracking()
.ToListAsync());
// GET /organizations/1
group.MapGet("/{id}",
async (int id, ApplicationDbContext dbContext, HttpContext httpContext, GeneralUseHelpers guhf) =>
{
Organisation? Org = await dbContext.Organisations.FindAsync(id);
if (Org is null) return Results.NotFound();
return Results.Ok(Org.ToOrgSummaryDto()); //OrgSummaryDto
})
.WithName(GetOrganizationEndpointName);
return group;
}
}

View File

@@ -3,7 +3,7 @@
public class EventRegistration public class EventRegistration
{ {
public int EventId { get; set; } public int EventId { get; set; }
public required string UserId { get; set; } public required int VolunteerId { get; set; }
public DateTime RegisteredAt { get; set; } = DateTime.UtcNow; public DateTime RegisteredAt { get; set; } = DateTime.UtcNow;
public Event? Event { get; set; } public Event? Event { get; set; }
public User? User { get; set; } public User? User { get; set; }

View File

@@ -0,0 +1,13 @@
namespace WebApp.Entities
{
public class Message
{
public int MessageId { get; set; }
public int EventType { get; set; }
public int VolunteerId { get; set; }
public int OrganizationId { get; set; }
public bool IsMsgFromVolunteer { get; set; }
public DateTime IsoDate { get; set; }
public string? Content { get; set; }
}
}

View File

@@ -0,0 +1,9 @@
namespace WebApp.Entities
{
public class MessageActivity
{
public int Recipient { get; set; }
public int Sender { get; set; }
public DateTime RecipientLastActive { get; set; }
}
}

View File

@@ -3,7 +3,7 @@
public class Organisation public class Organisation
{ {
public int OrganisationId { get; set; } public int OrganisationId { get; set; }
public required string UserId { get; set; } public required int UserId { get; set; }
public required string Name { get; set; } public required string Name { get; set; }
public string? Description { get; set; } public string? Description { get; set; }
public string? Website { get; set; } public string? Website { get; set; }

10
WebApp/Entities/Token.cs Normal file
View File

@@ -0,0 +1,10 @@
namespace WebApp.Entities
{
public class Token
{
public int TokenId { get; set; }
public required int UserId { get; set; }
public required DateTime ValidUntil { get; set; }
public string? Value { get; set; }
}
}

View File

@@ -1,9 +1,14 @@
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using System.ComponentModel.DataAnnotations;
namespace WebApp.Entities namespace WebApp.Entities
{ {
public class User : IdentityUser public class User //: IdentityUser
{ {
public int UserId { get; set; }
public string? Email { get; set; }
public string? Password { get; set; }
public required string FirstName { get; set; } public required string FirstName { get; set; }
public required string LastName { get; set; } public required string LastName { get; set; }
public bool IsOrganisation { get; set; } = false; public bool IsOrganisation { get; set; } = false;
@@ -11,5 +16,6 @@ namespace WebApp.Entities
public ICollection<VolunteerSkill> VolunteerSkills { get; set; } = new List<VolunteerSkill>(); public ICollection<VolunteerSkill> VolunteerSkills { get; set; } = new List<VolunteerSkill>();
public ICollection<EventRegistration> EventRegistrations { get; set; } = new List<EventRegistration>(); public ICollection<EventRegistration> EventRegistrations { get; set; } = new List<EventRegistration>();
public ICollection<Token> Tokens { get; set; } = new List<Token>();
} }
} }

View File

@@ -2,7 +2,7 @@
{ {
public class VolunteerSkill public class VolunteerSkill
{ {
public required string UserId { get; set; } public required int UserId { get; set; }
public int SkillId { get; set; } public int SkillId { get; set; }
public User? User { get; set; } public User? User { get; set; }

View File

@@ -10,7 +10,6 @@ public static class EventMapping
{ {
return new Event() return new Event()
{ {
OrganisationId = ECDto.OrganisationId!.Value,
Title = ECDto.Title, Title = ECDto.Title,
Description = ECDto.Description, Description = ECDto.Description,
Location = ECDto.Location, Location = ECDto.Location,
@@ -25,7 +24,6 @@ public static class EventMapping
return new Event() return new Event()
{ {
EventId = id, EventId = id,
OrganisationId = EUDto.OrganisationId!.Value,
Title = EUDto.Title, Title = EUDto.Title,
Description = EUDto.Description, Description = EUDto.Description,
Location = EUDto.Location, Location = EUDto.Location,
@@ -39,6 +37,7 @@ public static class EventMapping
return new EventSummaryDto( return new EventSummaryDto(
myEvent.EventId, myEvent.EventId,
myEvent.Organisation!.Name, myEvent.Organisation!.Name,
myEvent.OrganisationId,
myEvent.Title, myEvent.Title,
myEvent.Description, myEvent.Description,
myEvent.Location, myEvent.Location,
@@ -47,6 +46,19 @@ public static class EventMapping
myEvent.EventRegistrations myEvent.EventRegistrations
); );
} }
public static EventSummaryNoErDto ToEventSummaryNoErDto(this Event myEvent)
{
return new EventSummaryNoErDto(
myEvent.EventId,
myEvent.Organisation!.Name,
myEvent.OrganisationId,
myEvent.Title,
myEvent.Description,
myEvent.Location,
myEvent.EventDate,
myEvent.EventSkills
);
}
public static EventDetailsDto ToEventDetailsDto(this Event myEvent) public static EventDetailsDto ToEventDetailsDto(this Event myEvent)
{ {

View File

@@ -0,0 +1,27 @@
using Microsoft.EntityFrameworkCore;
using WebApp.DTOs;
using WebApp.Entities;
namespace WebApp.Mapping;
public static class OrganizationMapping
{
// obecnie zbędne
//public static Organisation ToEntity(this OrganisationSummaryDto ODto)
//{
// return new Organisation()
// {
// OrganisationId = ODto.OrganisationId!.Value,
// };
//}
public static OrganisationSummaryDto ToOrgSummaryDto(this Organisation org)
{
return new OrganisationSummaryDto(
org.OrganisationId,
org.Name,
org.Description,
org.Website
);
}
}

View File

@@ -0,0 +1,20 @@
using WebApp.DTOs;
using WebApp.Entities;
namespace WebApp.Mapping
{
public static class UserMapping
{
public static UserSummaryDto ToUserSummaryDto(this User user)
{
return new UserSummaryDto(
user.UserId,
user.Email,
user.FirstName,
user.LastName,
user.CreatedAt,
user.IsOrganisation
);
}
}
}

View File

@@ -1,281 +0,0 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using WebApp.Data;
#nullable disable
namespace WebApp.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20250408112459_InitialDataStore")]
partial class InitialDataStore
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "9.0.3")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("text");
b.Property<string>("Name")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("NormalizedName")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.HasKey("Id");
b.HasIndex("NormalizedName")
.IsUnique()
.HasDatabaseName("RoleNameIndex");
b.ToTable("AspNetRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("text");
b.Property<string>("ClaimValue")
.HasColumnType("text");
b.Property<string>("RoleId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("RoleId");
b.ToTable("AspNetRoleClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<int>("AccessFailedCount")
.HasColumnType("integer");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("text");
b.Property<string>("Email")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<bool>("EmailConfirmed")
.HasColumnType("boolean");
b.Property<bool>("LockoutEnabled")
.HasColumnType("boolean");
b.Property<DateTimeOffset?>("LockoutEnd")
.HasColumnType("timestamp with time zone");
b.Property<string>("NormalizedEmail")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("NormalizedUserName")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("PasswordHash")
.HasColumnType("text");
b.Property<string>("PhoneNumber")
.HasColumnType("text");
b.Property<bool>("PhoneNumberConfirmed")
.HasColumnType("boolean");
b.Property<string>("SecurityStamp")
.HasColumnType("text");
b.Property<bool>("TwoFactorEnabled")
.HasColumnType("boolean");
b.Property<string>("UserName")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.HasKey("Id");
b.HasIndex("NormalizedEmail")
.HasDatabaseName("EmailIndex");
b.HasIndex("NormalizedUserName")
.IsUnique()
.HasDatabaseName("UserNameIndex");
b.ToTable("AspNetUsers", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("text");
b.Property<string>("ClaimValue")
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("AspNetUserClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.Property<string>("LoginProvider")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("ProviderKey")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("ProviderDisplayName")
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("LoginProvider", "ProviderKey");
b.HasIndex("UserId");
b.ToTable("AspNetUserLogins", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("text");
b.Property<string>("RoleId")
.HasColumnType("text");
b.HasKey("UserId", "RoleId");
b.HasIndex("RoleId");
b.ToTable("AspNetUserRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("text");
b.Property<string>("LoginProvider")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("Name")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("Value")
.HasColumnType("text");
b.HasKey("UserId", "LoginProvider", "Name");
b.ToTable("AspNetUserTokens", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -1,223 +0,0 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace WebApp.Migrations
{
/// <inheritdoc />
public partial class InitialDataStore : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "AspNetRoles",
columns: table => new
{
Id = table.Column<string>(type: "text", nullable: false),
Name = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true),
NormalizedName = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true),
ConcurrencyStamp = table.Column<string>(type: "text", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_AspNetRoles", x => x.Id);
});
migrationBuilder.CreateTable(
name: "AspNetUsers",
columns: table => new
{
Id = table.Column<string>(type: "text", nullable: false),
UserName = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true),
NormalizedUserName = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true),
Email = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true),
NormalizedEmail = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true),
EmailConfirmed = table.Column<bool>(type: "boolean", nullable: false),
PasswordHash = table.Column<string>(type: "text", nullable: true),
SecurityStamp = table.Column<string>(type: "text", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "text", nullable: true),
PhoneNumber = table.Column<string>(type: "text", nullable: true),
PhoneNumberConfirmed = table.Column<bool>(type: "boolean", nullable: false),
TwoFactorEnabled = table.Column<bool>(type: "boolean", nullable: false),
LockoutEnd = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true),
LockoutEnabled = table.Column<bool>(type: "boolean", nullable: false),
AccessFailedCount = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_AspNetUsers", x => x.Id);
});
migrationBuilder.CreateTable(
name: "AspNetRoleClaims",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
RoleId = table.Column<string>(type: "text", nullable: false),
ClaimType = table.Column<string>(type: "text", nullable: true),
ClaimValue = table.Column<string>(type: "text", 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<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
UserId = table.Column<string>(type: "text", nullable: false),
ClaimType = table.Column<string>(type: "text", nullable: true),
ClaimValue = table.Column<string>(type: "text", 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<string>(type: "character varying(128)", maxLength: 128, nullable: false),
ProviderKey = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: false),
ProviderDisplayName = table.Column<string>(type: "text", nullable: true),
UserId = table.Column<string>(type: "text", 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
{
UserId = table.Column<string>(type: "text", nullable: false),
RoleId = table.Column<string>(type: "text", 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<string>(type: "text", nullable: false),
LoginProvider = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: false),
Name = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: false),
Value = table.Column<string>(type: "text", 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.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);
}
/// <inheritdoc />
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: "AspNetRoles");
migrationBuilder.DropTable(
name: "AspNetUsers");
}
}
}

View File

@@ -1,308 +0,0 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using WebApp.Data;
#nullable disable
namespace WebApp.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20250424195335_EventTable")]
partial class EventTable
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "9.0.3")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("text");
b.Property<string>("Name")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("NormalizedName")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.HasKey("Id");
b.HasIndex("NormalizedName")
.IsUnique()
.HasDatabaseName("RoleNameIndex");
b.ToTable("AspNetRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("text");
b.Property<string>("ClaimValue")
.HasColumnType("text");
b.Property<string>("RoleId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("RoleId");
b.ToTable("AspNetRoleClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<int>("AccessFailedCount")
.HasColumnType("integer");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("text");
b.Property<string>("Email")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<bool>("EmailConfirmed")
.HasColumnType("boolean");
b.Property<bool>("LockoutEnabled")
.HasColumnType("boolean");
b.Property<DateTimeOffset?>("LockoutEnd")
.HasColumnType("timestamp with time zone");
b.Property<string>("NormalizedEmail")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("NormalizedUserName")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("PasswordHash")
.HasColumnType("text");
b.Property<string>("PhoneNumber")
.HasColumnType("text");
b.Property<bool>("PhoneNumberConfirmed")
.HasColumnType("boolean");
b.Property<string>("SecurityStamp")
.HasColumnType("text");
b.Property<bool>("TwoFactorEnabled")
.HasColumnType("boolean");
b.Property<string>("UserName")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.HasKey("Id");
b.HasIndex("NormalizedEmail")
.HasDatabaseName("EmailIndex");
b.HasIndex("NormalizedUserName")
.IsUnique()
.HasDatabaseName("UserNameIndex");
b.ToTable("AspNetUsers", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("text");
b.Property<string>("ClaimValue")
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("AspNetUserClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.Property<string>("LoginProvider")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("ProviderKey")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("ProviderDisplayName")
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("LoginProvider", "ProviderKey");
b.HasIndex("UserId");
b.ToTable("AspNetUserLogins", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("text");
b.Property<string>("RoleId")
.HasColumnType("text");
b.HasKey("UserId", "RoleId");
b.HasIndex("RoleId");
b.ToTable("AspNetUserRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("text");
b.Property<string>("LoginProvider")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("Name")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("Value")
.HasColumnType("text");
b.HasKey("UserId", "LoginProvider", "Name");
b.ToTable("AspNetUserTokens", (string)null);
});
modelBuilder.Entity("WebApp.Entities.Event", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<DateTime>("Date")
.HasColumnType("timestamp with time zone");
b.Property<string>("Description")
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Place")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("Events");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -1,39 +0,0 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace WebApp.Migrations
{
/// <inheritdoc />
public partial class EventTable : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Events",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Name = table.Column<string>(type: "text", nullable: false),
Place = table.Column<string>(type: "text", nullable: false),
Description = table.Column<string>(type: "text", nullable: true),
Date = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Events", x => x.Id);
});
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Events");
}
}
}

View File

@@ -1,279 +0,0 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace WebApp.Migrations
{
/// <inheritdoc />
public partial class EventSkillsUsersOrganisations : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.RenameColumn(
name: "Place",
table: "Events",
newName: "Location");
migrationBuilder.RenameColumn(
name: "Name",
table: "Events",
newName: "Title");
migrationBuilder.RenameColumn(
name: "Date",
table: "Events",
newName: "EventDate");
migrationBuilder.RenameColumn(
name: "Id",
table: "Events",
newName: "EventId");
migrationBuilder.AddColumn<int>(
name: "OrganisationId",
table: "Events",
type: "integer",
nullable: false,
defaultValue: 0);
migrationBuilder.AddColumn<DateTime>(
name: "CreatedAt",
table: "AspNetUsers",
type: "timestamp with time zone",
nullable: false,
defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
migrationBuilder.AddColumn<string>(
name: "FirstName",
table: "AspNetUsers",
type: "text",
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<bool>(
name: "IsOrganisation",
table: "AspNetUsers",
type: "boolean",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<string>(
name: "LastName",
table: "AspNetUsers",
type: "text",
nullable: false,
defaultValue: "");
migrationBuilder.CreateTable(
name: "EventRegistrations",
columns: table => new
{
EventId = table.Column<int>(type: "integer", nullable: false),
UserId = table.Column<string>(type: "text", nullable: false),
RegisteredAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_EventRegistrations", x => new { x.UserId, x.EventId });
table.ForeignKey(
name: "FK_EventRegistrations_AspNetUsers_UserId",
column: x => x.UserId,
principalTable: "AspNetUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_EventRegistrations_Events_EventId",
column: x => x.EventId,
principalTable: "Events",
principalColumn: "EventId",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "Organisations",
columns: table => new
{
OrganisationId = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
UserId = table.Column<string>(type: "text", nullable: false),
Name = table.Column<string>(type: "text", nullable: false),
Description = table.Column<string>(type: "text", nullable: true),
Website = table.Column<string>(type: "text", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Organisations", x => x.OrganisationId);
table.ForeignKey(
name: "FK_Organisations_AspNetUsers_UserId",
column: x => x.UserId,
principalTable: "AspNetUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "Skills",
columns: table => new
{
SkillId = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Name = table.Column<string>(type: "text", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Skills", x => x.SkillId);
});
migrationBuilder.CreateTable(
name: "EventSkills",
columns: table => new
{
EventId = table.Column<int>(type: "integer", nullable: false),
SkillId = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_EventSkills", x => new { x.EventId, x.SkillId });
table.ForeignKey(
name: "FK_EventSkills_Events_EventId",
column: x => x.EventId,
principalTable: "Events",
principalColumn: "EventId",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_EventSkills_Skills_SkillId",
column: x => x.SkillId,
principalTable: "Skills",
principalColumn: "SkillId",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "VolunteerSkills",
columns: table => new
{
UserId = table.Column<string>(type: "text", nullable: false),
SkillId = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_VolunteerSkills", x => new { x.UserId, x.SkillId });
table.ForeignKey(
name: "FK_VolunteerSkills_AspNetUsers_UserId",
column: x => x.UserId,
principalTable: "AspNetUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_VolunteerSkills_Skills_SkillId",
column: x => x.SkillId,
principalTable: "Skills",
principalColumn: "SkillId",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_Events_OrganisationId",
table: "Events",
column: "OrganisationId");
migrationBuilder.CreateIndex(
name: "IX_EventRegistrations_EventId",
table: "EventRegistrations",
column: "EventId");
migrationBuilder.CreateIndex(
name: "IX_EventSkills_SkillId",
table: "EventSkills",
column: "SkillId");
migrationBuilder.CreateIndex(
name: "IX_Organisations_UserId",
table: "Organisations",
column: "UserId");
migrationBuilder.CreateIndex(
name: "IX_VolunteerSkills_SkillId",
table: "VolunteerSkills",
column: "SkillId");
migrationBuilder.AddForeignKey(
name: "FK_Events_Organisations_OrganisationId",
table: "Events",
column: "OrganisationId",
principalTable: "Organisations",
principalColumn: "OrganisationId",
onDelete: ReferentialAction.Cascade);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Events_Organisations_OrganisationId",
table: "Events");
migrationBuilder.DropTable(
name: "EventRegistrations");
migrationBuilder.DropTable(
name: "EventSkills");
migrationBuilder.DropTable(
name: "Organisations");
migrationBuilder.DropTable(
name: "VolunteerSkills");
migrationBuilder.DropTable(
name: "Skills");
migrationBuilder.DropIndex(
name: "IX_Events_OrganisationId",
table: "Events");
migrationBuilder.DropColumn(
name: "OrganisationId",
table: "Events");
migrationBuilder.DropColumn(
name: "CreatedAt",
table: "AspNetUsers");
migrationBuilder.DropColumn(
name: "FirstName",
table: "AspNetUsers");
migrationBuilder.DropColumn(
name: "IsOrganisation",
table: "AspNetUsers");
migrationBuilder.DropColumn(
name: "LastName",
table: "AspNetUsers");
migrationBuilder.RenameColumn(
name: "Title",
table: "Events",
newName: "Name");
migrationBuilder.RenameColumn(
name: "Location",
table: "Events",
newName: "Place");
migrationBuilder.RenameColumn(
name: "EventDate",
table: "Events",
newName: "Date");
migrationBuilder.RenameColumn(
name: "EventId",
table: "Events",
newName: "Id");
}
}
}

View File

@@ -1,526 +0,0 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using WebApp.Data;
#nullable disable
namespace WebApp.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20250428003000_ESUOrev2")]
partial class ESUOrev2
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "9.0.3")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole<string>", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("text");
b.Property<string>("Name")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("NormalizedName")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.HasKey("Id");
b.HasIndex("NormalizedName")
.IsUnique()
.HasDatabaseName("RoleNameIndex");
b.ToTable("AspNetRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("text");
b.Property<string>("ClaimValue")
.HasColumnType("text");
b.Property<string>("RoleId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("RoleId");
b.ToTable("AspNetRoleClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("text");
b.Property<string>("ClaimValue")
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("AspNetUserClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.Property<string>("LoginProvider")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("ProviderKey")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("ProviderDisplayName")
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("LoginProvider", "ProviderKey");
b.HasIndex("UserId");
b.ToTable("AspNetUserLogins", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("text");
b.Property<string>("RoleId")
.HasColumnType("text");
b.HasKey("UserId", "RoleId");
b.HasIndex("RoleId");
b.ToTable("AspNetUserRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("text");
b.Property<string>("LoginProvider")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("Name")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("Value")
.HasColumnType("text");
b.HasKey("UserId", "LoginProvider", "Name");
b.ToTable("AspNetUserTokens", (string)null);
});
modelBuilder.Entity("WebApp.Entities.Event", b =>
{
b.Property<int>("EventId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("EventId"));
b.Property<string>("Description")
.HasColumnType("text");
b.Property<DateTime>("EventDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("Location")
.IsRequired()
.HasColumnType("text");
b.Property<int>("OrganisationId")
.HasColumnType("integer");
b.Property<string>("Title")
.IsRequired()
.HasColumnType("text");
b.HasKey("EventId");
b.HasIndex("OrganisationId");
b.ToTable("Events");
});
modelBuilder.Entity("WebApp.Entities.EventRegistration", b =>
{
b.Property<string>("UserId")
.HasColumnType("text");
b.Property<int>("EventId")
.HasColumnType("integer");
b.Property<DateTime>("RegisteredAt")
.HasColumnType("timestamp with time zone");
b.HasKey("UserId", "EventId");
b.HasIndex("EventId");
b.ToTable("EventRegistrations");
});
modelBuilder.Entity("WebApp.Entities.EventSkill", b =>
{
b.Property<int>("EventId")
.HasColumnType("integer");
b.Property<int>("SkillId")
.HasColumnType("integer");
b.HasKey("EventId", "SkillId");
b.HasIndex("SkillId");
b.ToTable("EventSkills");
});
modelBuilder.Entity("WebApp.Entities.Organisation", b =>
{
b.Property<int>("OrganisationId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("OrganisationId"));
b.Property<string>("Description")
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Website")
.HasColumnType("text");
b.HasKey("OrganisationId");
b.HasIndex("UserId");
b.ToTable("Organisations");
});
modelBuilder.Entity("WebApp.Entities.Skill", b =>
{
b.Property<int>("SkillId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("SkillId"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("SkillId");
b.ToTable("Skills");
});
modelBuilder.Entity("WebApp.Entities.User", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<int>("AccessFailedCount")
.HasColumnType("integer");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("text");
b.Property<DateTime>("CreatedAt")
.HasColumnType("timestamp with time zone");
b.Property<string>("Email")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<bool>("EmailConfirmed")
.HasColumnType("boolean");
b.Property<string>("FirstName")
.IsRequired()
.HasColumnType("text");
b.Property<bool>("IsOrganisation")
.HasColumnType("boolean");
b.Property<string>("LastName")
.IsRequired()
.HasColumnType("text");
b.Property<bool>("LockoutEnabled")
.HasColumnType("boolean");
b.Property<DateTimeOffset?>("LockoutEnd")
.HasColumnType("timestamp with time zone");
b.Property<string>("NormalizedEmail")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("NormalizedUserName")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("PasswordHash")
.HasColumnType("text");
b.Property<string>("PhoneNumber")
.HasColumnType("text");
b.Property<bool>("PhoneNumberConfirmed")
.HasColumnType("boolean");
b.Property<string>("SecurityStamp")
.HasColumnType("text");
b.Property<bool>("TwoFactorEnabled")
.HasColumnType("boolean");
b.Property<string>("UserName")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.HasKey("Id");
b.HasIndex("NormalizedEmail")
.HasDatabaseName("EmailIndex");
b.HasIndex("NormalizedUserName")
.IsUnique()
.HasDatabaseName("UserNameIndex");
b.ToTable("AspNetUsers", (string)null);
});
modelBuilder.Entity("WebApp.Entities.VolunteerSkill", b =>
{
b.Property<string>("UserId")
.HasColumnType("text");
b.Property<int>("SkillId")
.HasColumnType("integer");
b.HasKey("UserId", "SkillId");
b.HasIndex("SkillId");
b.ToTable("VolunteerSkills");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole<string>", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.HasOne("WebApp.Entities.User", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.HasOne("WebApp.Entities.User", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole<string>", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("WebApp.Entities.User", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.HasOne("WebApp.Entities.User", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("WebApp.Entities.Event", b =>
{
b.HasOne("WebApp.Entities.Organisation", "Organisation")
.WithMany("Events")
.HasForeignKey("OrganisationId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Organisation");
});
modelBuilder.Entity("WebApp.Entities.EventRegistration", b =>
{
b.HasOne("WebApp.Entities.Event", "Event")
.WithMany("EventRegistrations")
.HasForeignKey("EventId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("WebApp.Entities.User", "User")
.WithMany("EventRegistrations")
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Event");
b.Navigation("User");
});
modelBuilder.Entity("WebApp.Entities.EventSkill", b =>
{
b.HasOne("WebApp.Entities.Event", "Event")
.WithMany("EventSkills")
.HasForeignKey("EventId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("WebApp.Entities.Skill", "Skill")
.WithMany("EventSkills")
.HasForeignKey("SkillId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Event");
b.Navigation("Skill");
});
modelBuilder.Entity("WebApp.Entities.Organisation", b =>
{
b.HasOne("WebApp.Entities.User", "User")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("WebApp.Entities.VolunteerSkill", b =>
{
b.HasOne("WebApp.Entities.Skill", "Skill")
.WithMany("VolunteerSkills")
.HasForeignKey("SkillId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("WebApp.Entities.User", "User")
.WithMany("VolunteerSkills")
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Skill");
b.Navigation("User");
});
modelBuilder.Entity("WebApp.Entities.Event", b =>
{
b.Navigation("EventRegistrations");
b.Navigation("EventSkills");
});
modelBuilder.Entity("WebApp.Entities.Organisation", b =>
{
b.Navigation("Events");
});
modelBuilder.Entity("WebApp.Entities.Skill", b =>
{
b.Navigation("EventSkills");
b.Navigation("VolunteerSkills");
});
modelBuilder.Entity("WebApp.Entities.User", b =>
{
b.Navigation("EventRegistrations");
b.Navigation("VolunteerSkills");
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -1,22 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace WebApp.Migrations
{
/// <inheritdoc />
public partial class ESUOrev2 : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
}
}
}

View File

@@ -12,8 +12,8 @@ using WebApp.Data;
namespace WebApp.Migrations namespace WebApp.Migrations
{ {
[DbContext(typeof(ApplicationDbContext))] [DbContext(typeof(ApplicationDbContext))]
[Migration("20250426222859_EventSkillsUsersOrganisations")] [Migration("20250518010555_ESUOrev5")]
partial class EventSkillsUsersOrganisations partial class ESUOrev5
{ {
/// <inheritdoc /> /// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder) protected override void BuildTargetModel(ModelBuilder modelBuilder)
@@ -25,7 +25,7 @@ namespace WebApp.Migrations
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole<string>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
{ {
b.Property<string>("Id") b.Property<string>("Id")
.HasColumnType("text"); .HasColumnType("text");
@@ -76,203 +76,7 @@ namespace WebApp.Migrations
b.ToTable("AspNetRoleClaims", (string)null); b.ToTable("AspNetRoleClaims", (string)null);
}); });
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("text");
b.Property<string>("ClaimValue")
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("AspNetUserClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.Property<string>("LoginProvider")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("ProviderKey")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("ProviderDisplayName")
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("LoginProvider", "ProviderKey");
b.HasIndex("UserId");
b.ToTable("AspNetUserLogins", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("text");
b.Property<string>("RoleId")
.HasColumnType("text");
b.HasKey("UserId", "RoleId");
b.HasIndex("RoleId");
b.ToTable("AspNetUserRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("text");
b.Property<string>("LoginProvider")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("Name")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("Value")
.HasColumnType("text");
b.HasKey("UserId", "LoginProvider", "Name");
b.ToTable("AspNetUserTokens", (string)null);
});
modelBuilder.Entity("WebApp.Entities.Event", b =>
{
b.Property<int>("EventId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("EventId"));
b.Property<string>("Description")
.HasColumnType("text");
b.Property<DateTime>("EventDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("Location")
.IsRequired()
.HasColumnType("text");
b.Property<int>("OrganisationId")
.HasColumnType("integer");
b.Property<string>("Title")
.IsRequired()
.HasColumnType("text");
b.HasKey("EventId");
b.HasIndex("OrganisationId");
b.ToTable("Events");
});
modelBuilder.Entity("WebApp.Entities.EventRegistration", b =>
{
b.Property<string>("UserId")
.HasColumnType("text");
b.Property<int>("EventId")
.HasColumnType("integer");
b.Property<DateTime>("RegisteredAt")
.HasColumnType("timestamp with time zone");
b.HasKey("UserId", "EventId");
b.HasIndex("EventId");
b.ToTable("EventRegistrations");
});
modelBuilder.Entity("WebApp.Entities.EventSkill", b =>
{
b.Property<int>("EventId")
.HasColumnType("integer");
b.Property<int>("SkillId")
.HasColumnType("integer");
b.HasKey("EventId", "SkillId");
b.HasIndex("SkillId");
b.ToTable("EventSkills");
});
modelBuilder.Entity("WebApp.Entities.Organisation", b =>
{
b.Property<int>("OrganisationId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("OrganisationId"));
b.Property<string>("Description")
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Website")
.HasColumnType("text");
b.HasKey("OrganisationId");
b.HasIndex("UserId");
b.ToTable("Organisations");
});
modelBuilder.Entity("WebApp.Entities.Skill", b =>
{
b.Property<int>("SkillId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("SkillId"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("SkillId");
b.ToTable("Skills");
});
modelBuilder.Entity("WebApp.Entities.User", b =>
{ {
b.Property<string>("Id") b.Property<string>("Id")
.HasColumnType("text"); .HasColumnType("text");
@@ -284,9 +88,6 @@ namespace WebApp.Migrations
.IsConcurrencyToken() .IsConcurrencyToken()
.HasColumnType("text"); .HasColumnType("text");
b.Property<DateTime>("CreatedAt")
.HasColumnType("timestamp with time zone");
b.Property<string>("Email") b.Property<string>("Email")
.HasMaxLength(256) .HasMaxLength(256)
.HasColumnType("character varying(256)"); .HasColumnType("character varying(256)");
@@ -294,17 +95,6 @@ namespace WebApp.Migrations
b.Property<bool>("EmailConfirmed") b.Property<bool>("EmailConfirmed")
.HasColumnType("boolean"); .HasColumnType("boolean");
b.Property<string>("FirstName")
.IsRequired()
.HasColumnType("text");
b.Property<bool>("IsOrganisation")
.HasColumnType("boolean");
b.Property<string>("LastName")
.IsRequired()
.HasColumnType("text");
b.Property<bool>("LockoutEnabled") b.Property<bool>("LockoutEnabled")
.HasColumnType("boolean"); .HasColumnType("boolean");
@@ -350,11 +140,311 @@ namespace WebApp.Migrations
b.ToTable("AspNetUsers", (string)null); b.ToTable("AspNetUsers", (string)null);
}); });
modelBuilder.Entity("WebApp.Entities.VolunteerSkill", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("text");
b.Property<string>("ClaimValue")
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("AspNetUserClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.Property<string>("LoginProvider")
.HasColumnType("text");
b.Property<string>("ProviderKey")
.HasColumnType("text");
b.Property<string>("ProviderDisplayName")
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("LoginProvider", "ProviderKey");
b.HasIndex("UserId");
b.ToTable("AspNetUserLogins", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{ {
b.Property<string>("UserId") b.Property<string>("UserId")
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("RoleId")
.HasColumnType("text");
b.HasKey("UserId", "RoleId");
b.HasIndex("RoleId");
b.ToTable("AspNetUserRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("text");
b.Property<string>("LoginProvider")
.HasColumnType("text");
b.Property<string>("Name")
.HasColumnType("text");
b.Property<string>("Value")
.HasColumnType("text");
b.HasKey("UserId", "LoginProvider", "Name");
b.ToTable("AspNetUserTokens", (string)null);
});
modelBuilder.Entity("WebApp.Entities.Event", b =>
{
b.Property<int>("EventId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("EventId"));
b.Property<string>("Description")
.HasColumnType("text");
b.Property<DateTime>("EventDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("Location")
.IsRequired()
.HasColumnType("text");
b.Property<int>("OrganisationId")
.HasColumnType("integer");
b.Property<string>("Title")
.IsRequired()
.HasColumnType("text");
b.HasKey("EventId");
b.HasIndex("OrganisationId");
b.ToTable("Events");
});
modelBuilder.Entity("WebApp.Entities.EventRegistration", b =>
{
b.Property<int>("VolunteerId")
.HasColumnType("integer");
b.Property<int>("EventId")
.HasColumnType("integer");
b.Property<DateTime>("RegisteredAt")
.HasColumnType("timestamp with time zone");
b.Property<int?>("UserId")
.HasColumnType("integer");
b.HasKey("VolunteerId", "EventId");
b.HasIndex("EventId");
b.HasIndex("UserId");
b.ToTable("EventRegistrations");
});
modelBuilder.Entity("WebApp.Entities.EventSkill", b =>
{
b.Property<int>("EventId")
.HasColumnType("integer");
b.Property<int>("SkillId")
.HasColumnType("integer");
b.HasKey("EventId", "SkillId");
b.HasIndex("SkillId");
b.ToTable("EventSkills");
});
modelBuilder.Entity("WebApp.Entities.Message", b =>
{
b.Property<int>("MessageId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MessageId"));
b.Property<string>("Content")
.HasColumnType("text");
b.Property<int>("EventType")
.HasColumnType("integer");
b.Property<bool>("IsMsgFromVolunteer")
.HasColumnType("boolean");
b.Property<DateTime>("IsoDate")
.HasColumnType("timestamp with time zone");
b.Property<int>("OrganizationId")
.HasColumnType("integer");
b.Property<int>("VolunteerId")
.HasColumnType("integer");
b.HasKey("MessageId");
b.ToTable("Messages");
});
modelBuilder.Entity("WebApp.Entities.MessageActivity", b =>
{
b.Property<int>("Sender")
.HasColumnType("integer");
b.Property<int>("Recipient")
.HasColumnType("integer");
b.Property<DateTime>("RecipientLastActive")
.HasColumnType("timestamp with time zone");
b.HasKey("Sender", "Recipient");
b.ToTable("MessagesActivities");
});
modelBuilder.Entity("WebApp.Entities.Organisation", b =>
{
b.Property<int>("OrganisationId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("OrganisationId"));
b.Property<string>("Description")
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<int>("UserId")
.HasColumnType("integer");
b.Property<string>("Website")
.HasColumnType("text");
b.HasKey("OrganisationId");
b.HasIndex("UserId");
b.ToTable("Organisations");
});
modelBuilder.Entity("WebApp.Entities.Skill", b =>
{
b.Property<int>("SkillId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("SkillId"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("SkillId");
b.ToTable("Skills");
});
modelBuilder.Entity("WebApp.Entities.Token", b =>
{
b.Property<int>("TokenId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("TokenId"));
b.Property<int>("UserId")
.HasColumnType("integer");
b.Property<DateTime>("ValidUntil")
.HasColumnType("timestamp with time zone");
b.Property<string>("Value")
.HasColumnType("text");
b.HasKey("TokenId");
b.HasIndex("UserId");
b.ToTable("Tokens");
});
modelBuilder.Entity("WebApp.Entities.User", b =>
{
b.Property<int>("UserId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("UserId"));
b.Property<DateTime>("CreatedAt")
.HasColumnType("timestamp with time zone");
b.Property<string>("Email")
.HasColumnType("text");
b.Property<string>("FirstName")
.IsRequired()
.HasColumnType("text");
b.Property<bool>("IsOrganisation")
.HasColumnType("boolean");
b.Property<string>("LastName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Password")
.HasColumnType("text");
b.HasKey("UserId");
b.ToTable("WebUsers");
});
modelBuilder.Entity("WebApp.Entities.VolunteerSkill", b =>
{
b.Property<int>("UserId")
.HasColumnType("integer");
b.Property<int>("SkillId") b.Property<int>("SkillId")
.HasColumnType("integer"); .HasColumnType("integer");
@@ -367,7 +457,7 @@ namespace WebApp.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{ {
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole<string>", null) b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany() .WithMany()
.HasForeignKey("RoleId") .HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -376,7 +466,7 @@ namespace WebApp.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{ {
b.HasOne("WebApp.Entities.User", null) b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -385,7 +475,7 @@ namespace WebApp.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{ {
b.HasOne("WebApp.Entities.User", null) b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -394,13 +484,13 @@ namespace WebApp.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{ {
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole<string>", null) b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany() .WithMany()
.HasForeignKey("RoleId") .HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.HasOne("WebApp.Entities.User", null) b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -409,7 +499,7 @@ namespace WebApp.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{ {
b.HasOne("WebApp.Entities.User", null) b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -437,9 +527,7 @@ namespace WebApp.Migrations
b.HasOne("WebApp.Entities.User", "User") b.HasOne("WebApp.Entities.User", "User")
.WithMany("EventRegistrations") .WithMany("EventRegistrations")
.HasForeignKey("UserId") .HasForeignKey("UserId");
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Event"); b.Navigation("Event");
@@ -476,6 +564,15 @@ namespace WebApp.Migrations
b.Navigation("User"); b.Navigation("User");
}); });
modelBuilder.Entity("WebApp.Entities.Token", b =>
{
b.HasOne("WebApp.Entities.User", null)
.WithMany("Tokens")
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("WebApp.Entities.VolunteerSkill", b => modelBuilder.Entity("WebApp.Entities.VolunteerSkill", b =>
{ {
b.HasOne("WebApp.Entities.Skill", "Skill") b.HasOne("WebApp.Entities.Skill", "Skill")
@@ -518,6 +615,8 @@ namespace WebApp.Migrations
{ {
b.Navigation("EventRegistrations"); b.Navigation("EventRegistrations");
b.Navigation("Tokens");
b.Navigation("VolunteerSkills"); b.Navigation("VolunteerSkills");
}); });
#pragma warning restore 612, 618 #pragma warning restore 612, 618

View File

@@ -0,0 +1,489 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace WebApp.Migrations
{
/// <inheritdoc />
public partial class ESUOrev5 : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "AspNetRoles",
columns: table => new
{
Id = table.Column<string>(type: "text", nullable: false),
Name = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true),
NormalizedName = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true),
ConcurrencyStamp = table.Column<string>(type: "text", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_AspNetRoles", x => x.Id);
});
migrationBuilder.CreateTable(
name: "AspNetUsers",
columns: table => new
{
Id = table.Column<string>(type: "text", nullable: false),
UserName = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true),
NormalizedUserName = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true),
Email = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true),
NormalizedEmail = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true),
EmailConfirmed = table.Column<bool>(type: "boolean", nullable: false),
PasswordHash = table.Column<string>(type: "text", nullable: true),
SecurityStamp = table.Column<string>(type: "text", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "text", nullable: true),
PhoneNumber = table.Column<string>(type: "text", nullable: true),
PhoneNumberConfirmed = table.Column<bool>(type: "boolean", nullable: false),
TwoFactorEnabled = table.Column<bool>(type: "boolean", nullable: false),
LockoutEnd = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true),
LockoutEnabled = table.Column<bool>(type: "boolean", nullable: false),
AccessFailedCount = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_AspNetUsers", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Messages",
columns: table => new
{
MessageId = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
EventType = table.Column<int>(type: "integer", nullable: false),
VolunteerId = table.Column<int>(type: "integer", nullable: false),
OrganizationId = table.Column<int>(type: "integer", nullable: false),
IsMsgFromVolunteer = table.Column<bool>(type: "boolean", nullable: false),
IsoDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
Content = table.Column<string>(type: "text", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Messages", x => x.MessageId);
});
migrationBuilder.CreateTable(
name: "MessagesActivities",
columns: table => new
{
Recipient = table.Column<int>(type: "integer", nullable: false),
Sender = table.Column<int>(type: "integer", nullable: false),
RecipientLastActive = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_MessagesActivities", x => new { x.Sender, x.Recipient });
});
migrationBuilder.CreateTable(
name: "Skills",
columns: table => new
{
SkillId = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Name = table.Column<string>(type: "text", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Skills", x => x.SkillId);
});
migrationBuilder.CreateTable(
name: "WebUsers",
columns: table => new
{
UserId = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Email = table.Column<string>(type: "text", nullable: true),
Password = table.Column<string>(type: "text", nullable: true),
FirstName = table.Column<string>(type: "text", nullable: false),
LastName = table.Column<string>(type: "text", nullable: false),
IsOrganisation = table.Column<bool>(type: "boolean", nullable: false),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_WebUsers", x => x.UserId);
});
migrationBuilder.CreateTable(
name: "AspNetRoleClaims",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
RoleId = table.Column<string>(type: "text", nullable: false),
ClaimType = table.Column<string>(type: "text", nullable: true),
ClaimValue = table.Column<string>(type: "text", 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<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
UserId = table.Column<string>(type: "text", nullable: false),
ClaimType = table.Column<string>(type: "text", nullable: true),
ClaimValue = table.Column<string>(type: "text", 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<string>(type: "text", nullable: false),
ProviderKey = table.Column<string>(type: "text", nullable: false),
ProviderDisplayName = table.Column<string>(type: "text", nullable: true),
UserId = table.Column<string>(type: "text", 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
{
UserId = table.Column<string>(type: "text", nullable: false),
RoleId = table.Column<string>(type: "text", 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<string>(type: "text", nullable: false),
LoginProvider = table.Column<string>(type: "text", nullable: false),
Name = table.Column<string>(type: "text", nullable: false),
Value = table.Column<string>(type: "text", 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: "Organisations",
columns: table => new
{
OrganisationId = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
UserId = table.Column<int>(type: "integer", nullable: false),
Name = table.Column<string>(type: "text", nullable: false),
Description = table.Column<string>(type: "text", nullable: true),
Website = table.Column<string>(type: "text", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Organisations", x => x.OrganisationId);
table.ForeignKey(
name: "FK_Organisations_WebUsers_UserId",
column: x => x.UserId,
principalTable: "WebUsers",
principalColumn: "UserId",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "Tokens",
columns: table => new
{
TokenId = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
UserId = table.Column<int>(type: "integer", nullable: false),
ValidUntil = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
Value = table.Column<string>(type: "text", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Tokens", x => x.TokenId);
table.ForeignKey(
name: "FK_Tokens_WebUsers_UserId",
column: x => x.UserId,
principalTable: "WebUsers",
principalColumn: "UserId",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "VolunteerSkills",
columns: table => new
{
UserId = table.Column<int>(type: "integer", nullable: false),
SkillId = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_VolunteerSkills", x => new { x.UserId, x.SkillId });
table.ForeignKey(
name: "FK_VolunteerSkills_Skills_SkillId",
column: x => x.SkillId,
principalTable: "Skills",
principalColumn: "SkillId",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_VolunteerSkills_WebUsers_UserId",
column: x => x.UserId,
principalTable: "WebUsers",
principalColumn: "UserId",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "Events",
columns: table => new
{
EventId = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
OrganisationId = table.Column<int>(type: "integer", nullable: false),
Title = table.Column<string>(type: "text", nullable: false),
Description = table.Column<string>(type: "text", nullable: true),
Location = table.Column<string>(type: "text", nullable: false),
EventDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Events", x => x.EventId);
table.ForeignKey(
name: "FK_Events_Organisations_OrganisationId",
column: x => x.OrganisationId,
principalTable: "Organisations",
principalColumn: "OrganisationId",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "EventRegistrations",
columns: table => new
{
EventId = table.Column<int>(type: "integer", nullable: false),
VolunteerId = table.Column<int>(type: "integer", nullable: false),
RegisteredAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
UserId = table.Column<int>(type: "integer", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_EventRegistrations", x => new { x.VolunteerId, x.EventId });
table.ForeignKey(
name: "FK_EventRegistrations_Events_EventId",
column: x => x.EventId,
principalTable: "Events",
principalColumn: "EventId",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_EventRegistrations_WebUsers_UserId",
column: x => x.UserId,
principalTable: "WebUsers",
principalColumn: "UserId");
});
migrationBuilder.CreateTable(
name: "EventSkills",
columns: table => new
{
EventId = table.Column<int>(type: "integer", nullable: false),
SkillId = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_EventSkills", x => new { x.EventId, x.SkillId });
table.ForeignKey(
name: "FK_EventSkills_Events_EventId",
column: x => x.EventId,
principalTable: "Events",
principalColumn: "EventId",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_EventSkills_Skills_SkillId",
column: x => x.SkillId,
principalTable: "Skills",
principalColumn: "SkillId",
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_EventRegistrations_EventId",
table: "EventRegistrations",
column: "EventId");
migrationBuilder.CreateIndex(
name: "IX_EventRegistrations_UserId",
table: "EventRegistrations",
column: "UserId");
migrationBuilder.CreateIndex(
name: "IX_Events_OrganisationId",
table: "Events",
column: "OrganisationId");
migrationBuilder.CreateIndex(
name: "IX_EventSkills_SkillId",
table: "EventSkills",
column: "SkillId");
migrationBuilder.CreateIndex(
name: "IX_Organisations_UserId",
table: "Organisations",
column: "UserId");
migrationBuilder.CreateIndex(
name: "IX_Tokens_UserId",
table: "Tokens",
column: "UserId");
migrationBuilder.CreateIndex(
name: "IX_VolunteerSkills_SkillId",
table: "VolunteerSkills",
column: "SkillId");
}
/// <inheritdoc />
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: "EventRegistrations");
migrationBuilder.DropTable(
name: "EventSkills");
migrationBuilder.DropTable(
name: "Messages");
migrationBuilder.DropTable(
name: "MessagesActivities");
migrationBuilder.DropTable(
name: "Tokens");
migrationBuilder.DropTable(
name: "VolunteerSkills");
migrationBuilder.DropTable(
name: "AspNetRoles");
migrationBuilder.DropTable(
name: "AspNetUsers");
migrationBuilder.DropTable(
name: "Events");
migrationBuilder.DropTable(
name: "Skills");
migrationBuilder.DropTable(
name: "Organisations");
migrationBuilder.DropTable(
name: "WebUsers");
}
}
}

View File

@@ -22,7 +22,7 @@ namespace WebApp.Migrations
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole<string>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
{ {
b.Property<string>("Id") b.Property<string>("Id")
.HasColumnType("text"); .HasColumnType("text");
@@ -73,203 +73,7 @@ namespace WebApp.Migrations
b.ToTable("AspNetRoleClaims", (string)null); b.ToTable("AspNetRoleClaims", (string)null);
}); });
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("text");
b.Property<string>("ClaimValue")
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("AspNetUserClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.Property<string>("LoginProvider")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("ProviderKey")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("ProviderDisplayName")
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("LoginProvider", "ProviderKey");
b.HasIndex("UserId");
b.ToTable("AspNetUserLogins", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("text");
b.Property<string>("RoleId")
.HasColumnType("text");
b.HasKey("UserId", "RoleId");
b.HasIndex("RoleId");
b.ToTable("AspNetUserRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("text");
b.Property<string>("LoginProvider")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("Name")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("Value")
.HasColumnType("text");
b.HasKey("UserId", "LoginProvider", "Name");
b.ToTable("AspNetUserTokens", (string)null);
});
modelBuilder.Entity("WebApp.Entities.Event", b =>
{
b.Property<int>("EventId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("EventId"));
b.Property<string>("Description")
.HasColumnType("text");
b.Property<DateTime>("EventDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("Location")
.IsRequired()
.HasColumnType("text");
b.Property<int>("OrganisationId")
.HasColumnType("integer");
b.Property<string>("Title")
.IsRequired()
.HasColumnType("text");
b.HasKey("EventId");
b.HasIndex("OrganisationId");
b.ToTable("Events");
});
modelBuilder.Entity("WebApp.Entities.EventRegistration", b =>
{
b.Property<string>("UserId")
.HasColumnType("text");
b.Property<int>("EventId")
.HasColumnType("integer");
b.Property<DateTime>("RegisteredAt")
.HasColumnType("timestamp with time zone");
b.HasKey("UserId", "EventId");
b.HasIndex("EventId");
b.ToTable("EventRegistrations");
});
modelBuilder.Entity("WebApp.Entities.EventSkill", b =>
{
b.Property<int>("EventId")
.HasColumnType("integer");
b.Property<int>("SkillId")
.HasColumnType("integer");
b.HasKey("EventId", "SkillId");
b.HasIndex("SkillId");
b.ToTable("EventSkills");
});
modelBuilder.Entity("WebApp.Entities.Organisation", b =>
{
b.Property<int>("OrganisationId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("OrganisationId"));
b.Property<string>("Description")
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Website")
.HasColumnType("text");
b.HasKey("OrganisationId");
b.HasIndex("UserId");
b.ToTable("Organisations");
});
modelBuilder.Entity("WebApp.Entities.Skill", b =>
{
b.Property<int>("SkillId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("SkillId"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("SkillId");
b.ToTable("Skills");
});
modelBuilder.Entity("WebApp.Entities.User", b =>
{ {
b.Property<string>("Id") b.Property<string>("Id")
.HasColumnType("text"); .HasColumnType("text");
@@ -281,9 +85,6 @@ namespace WebApp.Migrations
.IsConcurrencyToken() .IsConcurrencyToken()
.HasColumnType("text"); .HasColumnType("text");
b.Property<DateTime>("CreatedAt")
.HasColumnType("timestamp with time zone");
b.Property<string>("Email") b.Property<string>("Email")
.HasMaxLength(256) .HasMaxLength(256)
.HasColumnType("character varying(256)"); .HasColumnType("character varying(256)");
@@ -291,17 +92,6 @@ namespace WebApp.Migrations
b.Property<bool>("EmailConfirmed") b.Property<bool>("EmailConfirmed")
.HasColumnType("boolean"); .HasColumnType("boolean");
b.Property<string>("FirstName")
.IsRequired()
.HasColumnType("text");
b.Property<bool>("IsOrganisation")
.HasColumnType("boolean");
b.Property<string>("LastName")
.IsRequired()
.HasColumnType("text");
b.Property<bool>("LockoutEnabled") b.Property<bool>("LockoutEnabled")
.HasColumnType("boolean"); .HasColumnType("boolean");
@@ -347,11 +137,311 @@ namespace WebApp.Migrations
b.ToTable("AspNetUsers", (string)null); b.ToTable("AspNetUsers", (string)null);
}); });
modelBuilder.Entity("WebApp.Entities.VolunteerSkill", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("text");
b.Property<string>("ClaimValue")
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("AspNetUserClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.Property<string>("LoginProvider")
.HasColumnType("text");
b.Property<string>("ProviderKey")
.HasColumnType("text");
b.Property<string>("ProviderDisplayName")
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("LoginProvider", "ProviderKey");
b.HasIndex("UserId");
b.ToTable("AspNetUserLogins", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{ {
b.Property<string>("UserId") b.Property<string>("UserId")
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("RoleId")
.HasColumnType("text");
b.HasKey("UserId", "RoleId");
b.HasIndex("RoleId");
b.ToTable("AspNetUserRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("text");
b.Property<string>("LoginProvider")
.HasColumnType("text");
b.Property<string>("Name")
.HasColumnType("text");
b.Property<string>("Value")
.HasColumnType("text");
b.HasKey("UserId", "LoginProvider", "Name");
b.ToTable("AspNetUserTokens", (string)null);
});
modelBuilder.Entity("WebApp.Entities.Event", b =>
{
b.Property<int>("EventId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("EventId"));
b.Property<string>("Description")
.HasColumnType("text");
b.Property<DateTime>("EventDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("Location")
.IsRequired()
.HasColumnType("text");
b.Property<int>("OrganisationId")
.HasColumnType("integer");
b.Property<string>("Title")
.IsRequired()
.HasColumnType("text");
b.HasKey("EventId");
b.HasIndex("OrganisationId");
b.ToTable("Events");
});
modelBuilder.Entity("WebApp.Entities.EventRegistration", b =>
{
b.Property<int>("VolunteerId")
.HasColumnType("integer");
b.Property<int>("EventId")
.HasColumnType("integer");
b.Property<DateTime>("RegisteredAt")
.HasColumnType("timestamp with time zone");
b.Property<int?>("UserId")
.HasColumnType("integer");
b.HasKey("VolunteerId", "EventId");
b.HasIndex("EventId");
b.HasIndex("UserId");
b.ToTable("EventRegistrations");
});
modelBuilder.Entity("WebApp.Entities.EventSkill", b =>
{
b.Property<int>("EventId")
.HasColumnType("integer");
b.Property<int>("SkillId")
.HasColumnType("integer");
b.HasKey("EventId", "SkillId");
b.HasIndex("SkillId");
b.ToTable("EventSkills");
});
modelBuilder.Entity("WebApp.Entities.Message", b =>
{
b.Property<int>("MessageId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MessageId"));
b.Property<string>("Content")
.HasColumnType("text");
b.Property<int>("EventType")
.HasColumnType("integer");
b.Property<bool>("IsMsgFromVolunteer")
.HasColumnType("boolean");
b.Property<DateTime>("IsoDate")
.HasColumnType("timestamp with time zone");
b.Property<int>("OrganizationId")
.HasColumnType("integer");
b.Property<int>("VolunteerId")
.HasColumnType("integer");
b.HasKey("MessageId");
b.ToTable("Messages");
});
modelBuilder.Entity("WebApp.Entities.MessageActivity", b =>
{
b.Property<int>("Sender")
.HasColumnType("integer");
b.Property<int>("Recipient")
.HasColumnType("integer");
b.Property<DateTime>("RecipientLastActive")
.HasColumnType("timestamp with time zone");
b.HasKey("Sender", "Recipient");
b.ToTable("MessagesActivities");
});
modelBuilder.Entity("WebApp.Entities.Organisation", b =>
{
b.Property<int>("OrganisationId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("OrganisationId"));
b.Property<string>("Description")
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<int>("UserId")
.HasColumnType("integer");
b.Property<string>("Website")
.HasColumnType("text");
b.HasKey("OrganisationId");
b.HasIndex("UserId");
b.ToTable("Organisations");
});
modelBuilder.Entity("WebApp.Entities.Skill", b =>
{
b.Property<int>("SkillId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("SkillId"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("SkillId");
b.ToTable("Skills");
});
modelBuilder.Entity("WebApp.Entities.Token", b =>
{
b.Property<int>("TokenId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("TokenId"));
b.Property<int>("UserId")
.HasColumnType("integer");
b.Property<DateTime>("ValidUntil")
.HasColumnType("timestamp with time zone");
b.Property<string>("Value")
.HasColumnType("text");
b.HasKey("TokenId");
b.HasIndex("UserId");
b.ToTable("Tokens");
});
modelBuilder.Entity("WebApp.Entities.User", b =>
{
b.Property<int>("UserId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("UserId"));
b.Property<DateTime>("CreatedAt")
.HasColumnType("timestamp with time zone");
b.Property<string>("Email")
.HasColumnType("text");
b.Property<string>("FirstName")
.IsRequired()
.HasColumnType("text");
b.Property<bool>("IsOrganisation")
.HasColumnType("boolean");
b.Property<string>("LastName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Password")
.HasColumnType("text");
b.HasKey("UserId");
b.ToTable("WebUsers");
});
modelBuilder.Entity("WebApp.Entities.VolunteerSkill", b =>
{
b.Property<int>("UserId")
.HasColumnType("integer");
b.Property<int>("SkillId") b.Property<int>("SkillId")
.HasColumnType("integer"); .HasColumnType("integer");
@@ -364,7 +454,7 @@ namespace WebApp.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{ {
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole<string>", null) b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany() .WithMany()
.HasForeignKey("RoleId") .HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -373,7 +463,7 @@ namespace WebApp.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{ {
b.HasOne("WebApp.Entities.User", null) b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -382,7 +472,7 @@ namespace WebApp.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{ {
b.HasOne("WebApp.Entities.User", null) b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -391,13 +481,13 @@ namespace WebApp.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{ {
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole<string>", null) b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany() .WithMany()
.HasForeignKey("RoleId") .HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.HasOne("WebApp.Entities.User", null) b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -406,7 +496,7 @@ namespace WebApp.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{ {
b.HasOne("WebApp.Entities.User", null) b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -434,9 +524,7 @@ namespace WebApp.Migrations
b.HasOne("WebApp.Entities.User", "User") b.HasOne("WebApp.Entities.User", "User")
.WithMany("EventRegistrations") .WithMany("EventRegistrations")
.HasForeignKey("UserId") .HasForeignKey("UserId");
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Event"); b.Navigation("Event");
@@ -473,6 +561,15 @@ namespace WebApp.Migrations
b.Navigation("User"); b.Navigation("User");
}); });
modelBuilder.Entity("WebApp.Entities.Token", b =>
{
b.HasOne("WebApp.Entities.User", null)
.WithMany("Tokens")
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("WebApp.Entities.VolunteerSkill", b => modelBuilder.Entity("WebApp.Entities.VolunteerSkill", b =>
{ {
b.HasOne("WebApp.Entities.Skill", "Skill") b.HasOne("WebApp.Entities.Skill", "Skill")
@@ -515,6 +612,8 @@ namespace WebApp.Migrations
{ {
b.Navigation("EventRegistrations"); b.Navigation("EventRegistrations");
b.Navigation("Tokens");
b.Navigation("VolunteerSkills"); b.Navigation("VolunteerSkills");
}); });
#pragma warning restore 612, 618 #pragma warning restore 612, 618

View File

@@ -15,8 +15,8 @@ builder.Services.AddDbContext<ApplicationDbContext>(options =>
builder.Services.AddDatabaseDeveloperPageExceptionFilter(); builder.Services.AddDatabaseDeveloperPageExceptionFilter();
// Configure Identity // Configure Identity
builder.Services.AddDefaultIdentity<User>(options => options.SignIn.RequireConfirmedAccount = true) //builder.Services.AddDefaultIdentity<User>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>(); // .AddEntityFrameworkStores<ApplicationDbContext>();
// API Services For Swagger // API Services For Swagger
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
@@ -25,6 +25,8 @@ builder.Services.AddSwaggerGen(c =>
c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo { Title = "hermes", Version = "v1" }); c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo { Title = "hermes", Version = "v1" });
}); });
builder.Services.AddScoped<GeneralUseHelpers>();
// Build Application // Build Application
var app = builder.Build(); var app = builder.Build();
@@ -45,10 +47,11 @@ app.UseHttpsRedirection(); // Redirects all HTTP requests to HTTPS
app.UseDefaultFiles(); // Serves default files (index.html) if no specific file is requested app.UseDefaultFiles(); // Serves default files (index.html) if no specific file is requested
app.UseStaticFiles(); // Serves static files(CSS, JS, Img) from the wwwroot folder. app.UseStaticFiles(); // Serves static files(CSS, JS, Img) from the wwwroot folder.
app.UseRouting(); // Enables routing to match incoming request to endpoints app.UseRouting(); // Enables routing to match incoming request to endpoints
app.UseAuthorization(); //app.UseAuthorization();
// Map Minimal API Endpoints // Map Minimal API Endpoints
app.MapEventsEndpoints(); app.MapEventsEndpoints();
app.MapOrganizationsEndpoints();
app.MapAuthEndpoints();
app.Run(); app.Run();

View File

@@ -6,23 +6,20 @@ async function createEvent() {
const location = (document.getElementById('location') as HTMLInputElement).value; const location = (document.getElementById('location') as HTMLInputElement).value;
const description = (document.getElementById('description') as HTMLTextAreaElement).value; const description = (document.getElementById('description') as HTMLTextAreaElement).value;
const eventDateRaw = (document.getElementById('eventDate') as HTMLInputElement).value; const eventDateRaw = (document.getElementById('eventDate') as HTMLInputElement).value;
const organisationIdRaw = (document.getElementById('organisationId') as HTMLInputElement).value;
// Walidacja prostych pól // Walidacja prostych pól
if (!title || !location || !eventDateRaw || !organisationIdRaw) { if (!title || !location || !eventDateRaw) {
alert("Uzupełnij wszystkie wymagane pola!"); alert("Uzupełnij wszystkie wymagane pola!");
return; return;
} }
const eventDate = new Date(eventDateRaw).toISOString(); const eventDate = new Date(eventDateRaw).toISOString();
const organisationId = parseInt(organisationIdRaw);
const payload = { const payload = {
title, title,
location, location,
description, description,
eventDate, eventDate,
organisationId
}; };
try { try {

View File

@@ -21,7 +21,9 @@
card.className = "event-card filled"; card.className = "event-card filled";
card.innerHTML = ` card.innerHTML = `
<span>${ev.title}</span> <span>${ev.title}</span>
<button class="remove-btn delete-btn" data-id="${ev.eventId}"></button> <button class="remove-btn delete-btn" data-id="${ev.eventId}">
<svg xmlns="http://www.w3.org/2000/svg" height="30px" viewBox="0 -960 960 960" width="30px" fill="#FFFFFF"><path d="M280-440h400v-80H280v80ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg>
</button>
`; `;
container.appendChild(card); container.appendChild(card);
} }

View File

@@ -72,10 +72,6 @@
<label for="eventDate">Data</label> <label for="eventDate">Data</label>
<input id="eventDate" type="datetime-local" class="form-control input-field" /> <input id="eventDate" type="datetime-local" class="form-control input-field" />
</div> </div>
<div class="form-group mb-4">
<label for="organisationId">ID Organizacji</label>
<input id="organisationId" type="number" class="form-control input-field" />
</div>
<button id="saveBtn" class="button"><span>Save</span><span>&#11166;</span></button> <button id="saveBtn" class="button"><span>Save</span><span>&#11166;</span></button>

View File

@@ -16,20 +16,17 @@ function createEvent() {
const location = document.getElementById('location').value; const location = document.getElementById('location').value;
const description = document.getElementById('description').value; const description = document.getElementById('description').value;
const eventDateRaw = document.getElementById('eventDate').value; const eventDateRaw = document.getElementById('eventDate').value;
const organisationIdRaw = document.getElementById('organisationId').value;
// Walidacja prostych pól // Walidacja prostych pól
if (!title || !location || !eventDateRaw || !organisationIdRaw) { if (!title || !location || !eventDateRaw) {
alert("Uzupełnij wszystkie wymagane pola!"); alert("Uzupełnij wszystkie wymagane pola!");
return; return;
} }
const eventDate = new Date(eventDateRaw).toISOString(); const eventDate = new Date(eventDateRaw).toISOString();
const organisationId = parseInt(organisationIdRaw);
const payload = { const payload = {
title, title,
location, location,
description, description,
eventDate, eventDate,
organisationId
}; };
try { try {
const response = yield fetch('/api/events', { const response = yield fetch('/api/events', {

View File

@@ -28,7 +28,9 @@ document.addEventListener("DOMContentLoaded", () => __awaiter(void 0, void 0, vo
card.className = "event-card filled"; card.className = "event-card filled";
card.innerHTML = ` card.innerHTML = `
<span>${ev.title}</span> <span>${ev.title}</span>
<button class="remove-btn delete-btn" data-id="${ev.eventId}"><svg xmlns="http://www.w3.org/2000/svg" height="30px" viewBox="0 -960 960 960" width="30px" fill="#FFFFFF"><path d="M280-440h400v-80H280v80ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg></button> <button class="remove-btn delete-btn" data-id="${ev.eventId}">
<svg xmlns="http://www.w3.org/2000/svg" height="30px" viewBox="0 -960 960 960" width="30px" fill="#FFFFFF"><path d="M280-440h400v-80H280v80ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg>
</button>
`; `;
container.appendChild(card); container.appendChild(card);
} }

View File

@@ -7,5 +7,6 @@
"outDir": "WebApp/wwwroot/js", "outDir": "WebApp/wwwroot/js",
"lib": [ "es2015", "dom" ] "lib": [ "es2015", "dom" ]
}, },
"include": [ "WebApp/ts/**/*" ] "include": [ "WebApp/ts/**/*" ],
"compileOnSave": true
} }