Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Initiala ändringar för övergången från Firebase till Expo. #161

Draft
wants to merge 3 commits into
base: development
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Nexpo/Controllers/NotificationsController.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using FirebaseAdmin.Messaging;
//using FirebaseAdmin.Messaging;
using Google.Apis.Auth.OAuth2;
using FirebaseAdmin;
using Microsoft.AspNetCore.Mvc;
Expand Down
2 changes: 2 additions & 0 deletions Nexpo/Models/ApplicationDbContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ public class ApplicationDbContext : DbContext
public DbSet<Contact> Contacts { get; set; }
public DbSet<FrequentAskedQuestion> FrequentAskedQuestion { get; set; }

public DbSet<NotificationTopic> NotificationTopic { get; set; }

#pragma warning restore format

private readonly PasswordService _passwordService;
Expand Down
36 changes: 36 additions & 0 deletions Nexpo/Models/NotificationTopics.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text.Json.Serialization;

namespace Nexpo.Models
{
/// <summary>
/// Represents a notification topic
/// </summary>
public class NotificationTopic
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int? Id { get; set; }

[Required]
public TopicType Topic { get; set; }

[Required]
[JsonIgnore]
public User User { get; set; }



public enum TopicType
{
All,
Administratior,
CompanyRepresentative,
Student,

Volunteer,
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Jag är lite osäker på vad jag känner inför denna data modelen. Jag ser mycket hellre att vi endast har endast en single source of truth. Så den utgår från användarobjektet för att ta reda på vilka topics användaren borde ta del av. Så att konceptet att "subscribea" till en topic inte kanske finns kvar. (Om det var det som var tanken här?)

Om vi vill låta användaren välja vilka typer av notiser som ska tas emot ser jag hellre två stycken grupper där en kanske är Essential (eller ngt bättre namn) och Marketing. Och att man då i appen kan opta ut från marketing?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tanken är dels att kunna skicka påminnelse notiser till studenter som "subscribat" på events. för detta krävs ny tabell som håller koll på relationen. Håller med om att notiser till särskilda sorters användare inte borde gå till på detta sätt dock.

Tänker vi har borde gå tillväga att vi lägger till/ändrar modeler så vi har

  • notification

    • id
    • message
    • DateTime? scheduledtime
    • NotificationType //se nedan
    • eventId //nullable men krävs för eventspecifika notiser
    • UserNotficiations //länk till användare som får notisen
  • UserNotification - join table för many-to-many relation mellan vilka användare är länkade till vilka notiser

    • UserId
    • User
    • NotificationId
    • Notification
  • public enum NotificationType

    • general,
    • eventReminder
    • (specific) ksk för rollbaserade osv
    • etc

I User får man även lägga till UserNotifications collection för att representera alla notiser som sagd användare ska få. Via den tabellen kan användaren även hämta dess egna notiser vilket ger history vilket var skevt implementerat innan

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Är tanken sen att man ska kunna deep-linka med t.ex eventId i notification sedan? @LeoFjatstrom

Copy link
Contributor

@LeoFjatstrom LeoFjatstrom May 7, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

se här för hur man går tillväga med ändringar i databasen också

https://learn.microsoft.com/sv-se/ef/ef6/modeling/code-first/workflows/existing-database

allt med ef6 kan vara viktigt.

för bätte step-by-step utan att bli förvirrade se Update database i readmen


}
}

75 changes: 75 additions & 0 deletions Nexpo/Repositories/NotificationTopicRepository.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
using Nexpo.Models;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using static Nexpo.Models.NotificationTopic; //Denna borde ha importerats från Nexpo.Models?

namespace Nexpo.Repositories
{
public interface INotificationTopicRepository
{
//public Task<IEnumerable<Event>> GetAll();
public Task<List<NotificationTopic>> GetUserTopics(User _user);
public Task<List<User>> GetTopicSubscribers(NotificationTopic _topic);
public Task Add(TopicType _topic, User user);
public Task Delete(NotificationTopic _notificationTopic);
}

public class NotificationTopicRepository : INotificationTopicRepository
{
private readonly ApplicationDbContext _context;

public NotificationTopicRepository(ApplicationDbContext context)
{
_context = context;
}
/*
public async Task<IEnumerable<Event>> GetAll()
{
return await _context.Events.OrderBy(_event => _event.Date)
.ThenBy(_event => _event.Start)
.Select(_event => new Event
{
Id = _event.Id,
Name = _event.Name,
Description = _event.Description,
Date = _event.Date,
Type = _event.Type,
Start = _event.Start,
End = _event.End,
Location = _event.Location,
Host = _event.Host,
Language = _event.Language,
Capacity = _event.Capacity,
TicketCount = _event.Tickets.Count()
})
.ToListAsync();
}
*/


public async Task<List<NotificationTopic>> GetUserTopics(User user)
{
return await _context.NotificationTopic.Where(_topic => _topic.User == user).ToListAsync();
}
public async Task<List<User>> GetTopicSubscribers(NotificationTopic topic)
{
return await _context.NotificationTopic.Where(_topic => _topic.Topic == topic.Topic).Select(_topic => _topic.User).ToListAsync();
}


public async Task Add(TopicType topic, User user)
{
_context.NotificationTopic.Add(new NotificationTopic { Topic = topic, User = user });
await _context.SaveChangesAsync();
}


public async Task Delete(NotificationTopic NotificationTopic)
{
_context.NotificationTopic.Remove(NotificationTopic);
await _context.SaveChangesAsync();
}
}
}