Clean up legacy outgoing attachment duplicates

This commit is contained in:
sevenhill
2026-07-05 00:26:18 +03:00
parent b022218a1f
commit b518f22a09
14 changed files with 407 additions and 2 deletions
+19
View File
@@ -0,0 +1,19 @@
namespace QMax.Api.Data.Entities;
public sealed class Chat
{
public Guid Id { get; set; } = Guid.NewGuid();
public string? ExternalId { get; set; }
public ChatKind Kind { get; set; } = ChatKind.MaxDialog;
public string Title { get; set; } = "MAX chat";
public string? AvatarUrl { get; set; }
public string? LastMessagePreview { get; set; }
public DateTimeOffset? LastMessageAt { get; set; }
public int UnreadCount { get; set; }
public bool IsPinned { get; set; }
public bool IsMuted { get; set; }
public bool IsArchived { get; set; }
public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow;
public DateTimeOffset UpdatedAt { get; set; } = DateTimeOffset.UtcNow;
public ICollection<Message> Messages { get; set; } = new List<Message>();
}
+36
View File
@@ -0,0 +1,36 @@
namespace QMax.Api.Data.Entities;
public enum ChatKind
{
Direct = 0,
Group = 1,
Channel = 2,
MaxDialog = 3
}
public enum MessageDirection
{
Incoming = 0,
Outgoing = 1,
System = 2
}
public enum MessageDeliveryState
{
Sending = 0,
Sent = 1,
Delivered = 2,
Read = 3,
Failed = 4
}
public enum AttachmentKind
{
File = 0,
VoiceNote = 1,
Image = 2,
Video = 3,
Sticker = 4,
Gif = 5,
Contact = 6
}
@@ -0,0 +1,12 @@
namespace QMax.Api.Data.Entities;
public sealed class MaxAccountState
{
public int Id { get; set; } = 1;
public string PhoneNumber { get; set; } = "";
public string Status { get; set; } = "NotStarted";
public bool IsAuthorized { get; set; }
public string? LastUrl { get; set; }
public string? LastError { get; set; }
public DateTimeOffset UpdatedAt { get; set; } = DateTimeOffset.UtcNow;
}
+23
View File
@@ -0,0 +1,23 @@
namespace QMax.Api.Data.Entities;
public sealed class Message
{
public Guid Id { get; set; } = Guid.NewGuid();
public Guid ChatId { get; set; }
public Chat? Chat { get; set; }
public string? ExternalId { get; set; }
public string? SenderExternalId { get; set; }
public string? SenderName { get; set; }
public MessageDirection Direction { get; set; }
public string? Text { get; set; }
public DateTimeOffset SentAt { get; set; } = DateTimeOffset.UtcNow;
public DateTimeOffset? EditedAt { get; set; }
public DateTimeOffset? DeletedAt { get; set; }
public Guid? ReplyToMessageId { get; set; }
public string? ForwardedFrom { get; set; }
public MessageDeliveryState DeliveryState { get; set; } = MessageDeliveryState.Sent;
public string? Error { get; set; }
public string? MediaAlbumId { get; set; }
public ICollection<MessageAttachment> Attachments { get; set; } = new List<MessageAttachment>();
public ICollection<MessageReaction> Reactions { get; set; } = new List<MessageReaction>();
}
@@ -0,0 +1,18 @@
namespace QMax.Api.Data.Entities;
public sealed class MessageAttachment
{
public Guid Id { get; set; } = Guid.NewGuid();
public Guid MessageId { get; set; }
public Message? Message { get; set; }
public string? ExternalId { get; set; }
public string OriginalFileName { get; set; } = "file";
public string StorageFileName { get; set; } = "";
public string ContentType { get; set; } = "application/octet-stream";
public long FileSizeBytes { get; set; }
public string? Sha256 { get; set; }
public AttachmentKind Kind { get; set; } = AttachmentKind.File;
public int SortOrder { get; set; }
public string? RemoteUrl { get; set; }
public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow;
}
@@ -0,0 +1,12 @@
namespace QMax.Api.Data.Entities;
public sealed class MessageReaction
{
public Guid Id { get; set; } = Guid.NewGuid();
public Guid MessageId { get; set; }
public Message? Message { get; set; }
public string Emoji { get; set; } = "";
public string ActorKey { get; set; } = "self";
public string? ActorName { get; set; }
public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow;
}
@@ -0,0 +1,12 @@
namespace QMax.Api.Data.Entities;
public sealed class PushDevice
{
public Guid Id { get; set; } = Guid.NewGuid();
public Guid UserId { get; set; }
public User? User { get; set; }
public string FirebaseToken { get; set; } = "";
public string Platform { get; set; } = "android";
public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow;
public DateTimeOffset UpdatedAt { get; set; } = DateTimeOffset.UtcNow;
}
+12
View File
@@ -0,0 +1,12 @@
namespace QMax.Api.Data.Entities;
public sealed class User
{
public Guid Id { get; set; } = Guid.NewGuid();
public string DisplayName { get; set; } = "QMAX Owner";
public string? PhoneNumber { get; set; }
public string? AvatarPath { get; set; }
public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow;
public DateTimeOffset UpdatedAt { get; set; } = DateTimeOffset.UtcNow;
public ICollection<UserSession> Sessions { get; set; } = new List<UserSession>();
}
@@ -0,0 +1,14 @@
namespace QMax.Api.Data.Entities;
public sealed class UserSession
{
public Guid Id { get; set; } = Guid.NewGuid();
public Guid UserId { get; set; }
public User? User { get; set; }
public string DeviceName { get; set; } = "Android";
public string RefreshTokenHash { get; set; } = "";
public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow;
public DateTimeOffset LastSeenAt { get; set; } = DateTimeOffset.UtcNow;
public DateTimeOffset ExpiresAt { get; set; } = DateTimeOffset.UtcNow.AddDays(90);
public DateTimeOffset? RevokedAt { get; set; }
}