using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Iceshrimp.Shared.Helpers; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; using NpgsqlTypes; namespace Iceshrimp.Backend.Core.Database.Tables; [Table("notification")] [Index(nameof(Type))] [Index(nameof(IsRead))] [Index(nameof(NotifierId))] [Index(nameof(NotifieeId))] [Index(nameof(CreatedAt))] [Index(nameof(AppAccessTokenId))] [Index(nameof(MastoId))] [Index(nameof(NoteId))] public class Notification : IIdentifiable { [PgName("notification_type_enum")] public enum NotificationType { [PgName("follow")] Follow, [PgName("mention")] Mention, [PgName("reply")] Reply, [PgName("renote")] Renote, [PgName("quote")] Quote, [PgName("like")] Like, [PgName("reaction")] Reaction, [PgName("pollVote")] PollVote, [PgName("pollEnded")] PollEnded, [PgName("receiveFollowRequest")] FollowRequestReceived, [PgName("followRequestAccepted")] FollowRequestAccepted, [PgName("groupInvited")] GroupInvited, [PgName("app")] App, [PgName("edit")] Edit, [PgName("bite")] Bite } /// /// The created date of the Notification. /// [Column("createdAt")] public DateTime CreatedAt { get; set; } /// /// The ID of recipient user of the Notification. /// [Column("notifieeId")] [StringLength(32)] public string NotifieeId { get; set; } = null!; /// /// The ID of sender user of the Notification. /// [Column("notifierId")] [StringLength(32)] public string? NotifierId { get; set; } /// /// Whether the notification was read. /// [Column("isRead")] public bool IsRead { get; set; } [Column("type")] public NotificationType Type { get; set; } [Column("noteId")] [StringLength(32)] public string? NoteId { get; set; } [Column("biteId")] [StringLength(32)] public string? BiteId { get; set; } [Column("reaction")] [StringLength(128)] public string? Reaction { get; set; } [Column("choice")] public int? Choice { get; set; } [Column("followRequestId")] [StringLength(32)] public string? FollowRequestId { get; set; } [Column("userGroupInvitationId")] [StringLength(32)] public string? UserGroupInvitationId { get; set; } [Column("customBody")] [StringLength(2048)] public string? CustomBody { get; set; } [Column("customHeader")] [StringLength(256)] public string? CustomHeader { get; set; } [Column("customIcon")] [StringLength(1024)] public string? CustomIcon { get; set; } [Column("appAccessTokenId")] [StringLength(32)] public string? AppAccessTokenId { get; set; } [ForeignKey(nameof(FollowRequestId))] [InverseProperty(nameof(Tables.FollowRequest.Notifications))] public virtual FollowRequest? FollowRequest { get; set; } [ForeignKey(nameof(NoteId))] [InverseProperty(nameof(Tables.Note.Notifications))] public virtual Note? Note { get; set; } [ForeignKey(nameof(BiteId))] public virtual Bite? Bite { get; set; } [ForeignKey(nameof(NotifieeId))] [InverseProperty(nameof(User.NotificationNotifiees))] public virtual User Notifiee { get; set; } = null!; [ForeignKey(nameof(NotifierId))] [InverseProperty(nameof(User.NotificationNotifiers))] public virtual User? Notifier { get; set; } [ForeignKey(nameof(UserGroupInvitationId))] [InverseProperty(nameof(Tables.UserGroupInvitation.Notifications))] public virtual UserGroupInvitation? UserGroupInvitation { get; set; } [Column("masto_id")] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public long MastoId { get; set; } [Key] [Column("id")] [StringLength(32)] public string Id { get; set; } = null!; public Notification WithPrecomputedNoteVisibilities(bool reply, bool renote, bool renoteRenote) { Note = Note?.WithPrecomputedVisibilities(reply, renote, renoteRenote); return this; } private class EntityTypeConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder entity) { entity.Property(e => e.CreatedAt).HasComment("The created date of the Notification."); entity.Property(e => e.IsRead) .HasDefaultValue(false) .HasComment("Whether the notification was read."); entity.Property(e => e.NotifieeId).HasComment("The ID of recipient user of the Notification."); entity.Property(e => e.NotifierId).HasComment("The ID of sender user of the Notification."); entity.Property(e => e.Type).HasComment("The type of the Notification."); entity.HasOne(d => d.FollowRequest) .WithMany(p => p.Notifications) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(d => d.Note) .WithMany(p => p.Notifications) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(d => d.Notifiee) .WithMany(p => p.NotificationNotifiees) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(d => d.Notifier) .WithMany(p => p.NotificationNotifiers) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(d => d.UserGroupInvitation) .WithMany(p => p.Notifications) .OnDelete(DeleteBehavior.Cascade); } } }