203 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			203 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.ComponentModel.DataAnnotations;
 | |
| using System.ComponentModel.DataAnnotations.Schema;
 | |
| using System.Text.Json.Serialization;
 | |
| using Microsoft.EntityFrameworkCore;
 | |
| using NodaTime;
 | |
| using NodaTime.Serialization.Protobuf;
 | |
| 
 | |
| namespace DysonNetwork.Shared.Models;
 | |
| 
 | |
| public enum PublisherType
 | |
| {
 | |
|     Individual,
 | |
|     Organizational
 | |
| }
 | |
| 
 | |
| [Index(nameof(Name), IsUnique = true)]
 | |
| public class SnPublisher : ModelBase, IIdentifiedResource
 | |
| {
 | |
|     public Guid Id { get; set; } = Guid.NewGuid();
 | |
|     public PublisherType Type { get; set; }
 | |
|     [MaxLength(256)] public string Name { get; set; } = string.Empty;
 | |
|     [MaxLength(256)] public string Nick { get; set; } = string.Empty;
 | |
|     [MaxLength(4096)] public string? Bio { get; set; }
 | |
| 
 | |
|     [Column(TypeName = "jsonb")] public SnCloudFileReferenceObject? Picture { get; set; }
 | |
|     [Column(TypeName = "jsonb")] public SnCloudFileReferenceObject? Background { get; set; }
 | |
| 
 | |
|     [Column(TypeName = "jsonb")] public SnVerificationMark? Verification { get; set; }
 | |
| 
 | |
|     [JsonIgnore] public ICollection<SnPost> Posts { get; set; } = [];
 | |
|     [JsonIgnore] public ICollection<SnPoll> Polls { get; set; } = [];
 | |
|     [JsonIgnore] public ICollection<SnPostCollection> Collections { get; set; } = [];
 | |
|     [JsonIgnore] public ICollection<SnPublisherMember> Members { get; set; } = [];
 | |
|     [JsonIgnore] public ICollection<SnPublisherFeature> Features { get; set; } = [];
 | |
| 
 | |
|     [JsonIgnore]
 | |
|     public ICollection<SnPublisherSubscription> Subscriptions { get; set; } = [];
 | |
| 
 | |
|     public Guid? AccountId { get; set; }
 | |
|     public Guid? RealmId { get; set; }
 | |
|     [NotMapped] public SnRealm? Realm { get; set; }
 | |
|     [NotMapped] public SnAccount? Account { get; set; }
 | |
| 
 | |
|     public string ResourceIdentifier => $"publisher:{Id}";
 | |
| 
 | |
|     public static SnPublisher FromProtoValue(Proto.Publisher proto)
 | |
|     {
 | |
|         var publisher = new SnPublisher
 | |
|         {
 | |
|             Id = Guid.TryParse(proto.Id, out var id) ? id : Guid.NewGuid(),
 | |
|             Type = proto.Type == Shared.Proto.PublisherType.PubIndividual
 | |
|                 ? PublisherType.Individual
 | |
|                 : PublisherType.Organizational,
 | |
|             Name = proto.Name,
 | |
|             Nick = proto.Nick,
 | |
|             Bio = proto.Bio,
 | |
|             AccountId = Guid.TryParse(proto.AccountId, out var accountId) ? accountId : null,
 | |
|             RealmId = Guid.TryParse(proto.RealmId, out var realmId) ? realmId : null,
 | |
|         };
 | |
| 
 | |
|         if (proto.Picture != null)
 | |
|         {
 | |
|             publisher.Picture = new SnCloudFileReferenceObject
 | |
|             {
 | |
|                 Id = proto.Picture.Id,
 | |
|                 Name = proto.Picture.Name,
 | |
|                 MimeType = proto.Picture.MimeType,
 | |
|                 Hash = proto.Picture.Hash,
 | |
|                 Size = proto.Picture.Size,
 | |
|             };
 | |
|         }
 | |
| 
 | |
|         if (proto.Background != null)
 | |
|         {
 | |
|             publisher.Background = new SnCloudFileReferenceObject
 | |
|             {
 | |
|                 Id = proto.Background.Id,
 | |
|                 Name = proto.Background.Name,
 | |
|                 MimeType = proto.Background.MimeType,
 | |
|                 Hash = proto.Background.Hash,
 | |
|                 Size = proto.Background.Size,
 | |
|             };
 | |
|         }
 | |
| 
 | |
|         return publisher;
 | |
|     }
 | |
| 
 | |
|     public Proto.Publisher ToProtoValue()
 | |
|     {
 | |
|         var p = new Proto.Publisher()
 | |
|         {
 | |
|             Id = Id.ToString(),
 | |
|             Type = Type == PublisherType.Individual
 | |
|                 ? Shared.Proto.PublisherType.PubIndividual
 | |
|                 : Shared.Proto.PublisherType.PubOrganizational,
 | |
|             Name = Name,
 | |
|             Nick = Nick,
 | |
|             Bio = Bio,
 | |
|             AccountId = AccountId?.ToString() ?? string.Empty,
 | |
|             RealmId = RealmId?.ToString() ?? string.Empty,
 | |
|             CreatedAt = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTimeOffset(CreatedAt.ToDateTimeOffset()),
 | |
|             UpdatedAt = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTimeOffset(UpdatedAt.ToDateTimeOffset())
 | |
|         };
 | |
|         if (Picture is not null)
 | |
|         {
 | |
|             p.Picture = new Proto.CloudFile
 | |
|             {
 | |
|                 Id = Picture.Id,
 | |
|                 Name = Picture.Name,
 | |
|                 MimeType = Picture.MimeType,
 | |
|                 Hash = Picture.Hash,
 | |
|                 Size = Picture.Size,
 | |
|             };
 | |
|         }
 | |
| 
 | |
|         if (Background is not null)
 | |
|         {
 | |
|             p.Background = new Proto.CloudFile
 | |
|             {
 | |
|                 Id = Background.Id,
 | |
|                 Name = Background.Name,
 | |
|                 MimeType = Background.MimeType,
 | |
|                 Hash = Background.Hash,
 | |
|                 Size = Background.Size,
 | |
|             };
 | |
|         }
 | |
| 
 | |
|         return p;
 | |
|     }
 | |
| }
 | |
| 
 | |
| public enum PublisherMemberRole
 | |
| {
 | |
|     Owner = 100,
 | |
|     Manager = 75,
 | |
|     Editor = 50,
 | |
|     Viewer = 25
 | |
| }
 | |
| 
 | |
| public class SnPublisherMember : ModelBase
 | |
| {
 | |
|     public Guid PublisherId { get; set; }
 | |
|     [JsonIgnore] public SnPublisher Publisher { get; set; } = null!;
 | |
|     public Guid AccountId { get; set; }
 | |
|     [NotMapped] public SnAccount? Account { get; set; }
 | |
| 
 | |
|     public PublisherMemberRole Role { get; set; } = PublisherMemberRole.Viewer;
 | |
|     public Instant? JoinedAt { get; set; }
 | |
|     
 | |
|     
 | |
|     public Proto.PublisherMember ToProto()
 | |
|     {
 | |
|         return new Proto.PublisherMember()
 | |
|         {
 | |
|             PublisherId = PublisherId.ToString(),
 | |
|             AccountId = AccountId.ToString(),
 | |
|             Role = Role switch
 | |
|             {
 | |
|                 PublisherMemberRole.Owner => Shared.Proto.PublisherMemberRole.Owner,
 | |
|                 PublisherMemberRole.Manager => Shared.Proto.PublisherMemberRole.Manager,
 | |
|                 PublisherMemberRole.Editor => Shared.Proto.PublisherMemberRole.Editor,
 | |
|                 PublisherMemberRole.Viewer => Shared.Proto.PublisherMemberRole.Viewer,
 | |
|                 _ => throw new ArgumentOutOfRangeException(nameof(Role), Role, null)
 | |
|             },
 | |
|             JoinedAt = JoinedAt?.ToTimestamp()
 | |
|         };
 | |
|     }
 | |
| }
 | |
| 
 | |
| public enum PublisherSubscriptionStatus
 | |
| {
 | |
|     Active,
 | |
|     Expired,
 | |
|     Cancelled
 | |
| }
 | |
| 
 | |
| public class SnPublisherSubscription : ModelBase
 | |
| {
 | |
|     public Guid Id { get; set; }
 | |
| 
 | |
|     public Guid PublisherId { get; set; }
 | |
|     [JsonIgnore] public SnPublisher Publisher { get; set; } = null!;
 | |
|     public Guid AccountId { get; set; }
 | |
| 
 | |
|     public PublisherSubscriptionStatus Status { get; set; } = PublisherSubscriptionStatus.Active;
 | |
|     public int Tier { get; set; } = 0;
 | |
| }
 | |
| 
 | |
| public class SnPublisherFeature : ModelBase
 | |
| {
 | |
|     public Guid Id { get; set; }
 | |
|     [MaxLength(1024)] public string Flag { get; set; } = null!;
 | |
|     public Instant? ExpiredAt { get; set; }
 | |
| 
 | |
|     public Guid PublisherId { get; set; }
 | |
|     public SnPublisher Publisher { get; set; } = null!;
 | |
| }
 | |
| 
 | |
| public abstract class PublisherFeatureFlag
 | |
| {
 | |
|     public static List<string> AllFlags => [Develop];
 | |
|     public static string Develop = "develop";
 | |
| } |