♻️ Centralized data models (wip)

This commit is contained in:
2025-09-27 14:09:28 +08:00
parent 51b6f7309e
commit e70d8371f8
206 changed files with 1352 additions and 2128 deletions

View File

@@ -1,49 +0,0 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text.Json.Serialization;
using DysonNetwork.Shared.Data;
using Microsoft.EntityFrameworkCore;
namespace DysonNetwork.Sphere.Sticker;
[Index(nameof(Slug))] // The slug index shouldn't be unique, the sticker slug can be repeated across packs.
public class Sticker : ModelBase, IIdentifiedResource
{
public Guid Id { get; set; } = Guid.NewGuid();
[MaxLength(128)] public string Slug { get; set; } = null!;
// Outdated fields, for backward compability
[MaxLength(32)] public string? ImageId { get; set; }
[Column(TypeName = "jsonb")] public CloudFileReferenceObject? Image { get; set; } = null!;
public Guid PackId { get; set; }
[JsonIgnore] public StickerPack Pack { get; set; } = null!;
public string ResourceIdentifier => $"sticker:{Id}";
}
[Index(nameof(Prefix), IsUnique = true)]
public class StickerPack : ModelBase
{
public Guid Id { get; set; } = Guid.NewGuid();
[MaxLength(1024)] public string Name { get; set; } = null!;
[MaxLength(4096)] public string Description { get; set; } = string.Empty;
[MaxLength(128)] public string Prefix { get; set; } = null!;
public List<Sticker> Stickers { get; set; } = [];
[JsonIgnore] public List<StickerPackOwnership> Ownerships { get; set; } = [];
public Guid PublisherId { get; set; }
public Publisher.Publisher Publisher { get; set; } = null!;
}
public class StickerPackOwnership : ModelBase
{
public Guid Id { get; set; } = Guid.NewGuid();
public Guid PackId { get; set; }
public StickerPack Pack { get; set; } = null!;
public Guid AccountId { get; set; }
[NotMapped] public AccountReference Account { get; set; } = null!;
}

View File

@@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations;
using DysonNetwork.Shared.Auth;
using DysonNetwork.Shared.Data;
using DysonNetwork.Shared.Models;
using DysonNetwork.Shared.Proto;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
@@ -20,7 +20,7 @@ public class StickerController(
private async Task<IActionResult> _CheckStickerPackPermissions(
Guid packId,
Account currentUser,
Publisher.PublisherMemberRole requiredRole
Shared.Models.PublisherMemberRole requiredRole
)
{
var pack = await db.StickerPacks
@@ -46,7 +46,7 @@ public class StickerController(
[FromQuery(Name = "query")] string? query = null
)
{
Publisher.Publisher? publisher = null;
Shared.Models.SnPublisher? publisher = null;
if (pubName is not null)
publisher = await db.Publishers.FirstOrDefaultAsync(p => p.Name == pubName);
@@ -168,7 +168,7 @@ public class StickerController(
.FirstOrDefaultAsync(m => m.AccountId == accountId && m.PublisherId == pack.PublisherId);
if (member is null)
return StatusCode(403, "You are not a member of this publisher");
if (member.Role < Publisher.PublisherMemberRole.Editor)
if (member.Role < Shared.Models.PublisherMemberRole.Editor)
return StatusCode(403, "You need to be at least an editor to update sticker packs");
if (request.Name is not null)
@@ -200,7 +200,7 @@ public class StickerController(
.FirstOrDefaultAsync(m => m.AccountId == accountId && m.PublisherId == pack.PublisherId);
if (member is null)
return StatusCode(403, "You are not a member of this publisher");
if (member.Role < Publisher.PublisherMemberRole.Editor)
if (member.Role < Shared.Models.PublisherMemberRole.Editor)
return StatusCode(403, "You need to be an editor to delete sticker packs");
await st.DeleteStickerPackAsync(pack);
@@ -262,7 +262,7 @@ public class StickerController(
return Unauthorized();
var permissionCheck =
await _CheckStickerPackPermissions(packId, currentUser, Publisher.PublisherMemberRole.Editor);
await _CheckStickerPackPermissions(packId, currentUser, Shared.Models.PublisherMemberRole.Editor);
if (permissionCheck is not OkResult)
return permissionCheck;
@@ -277,14 +277,14 @@ public class StickerController(
if (request.Slug is not null)
sticker.Slug = request.Slug;
CloudFileReferenceObject? image = null;
SnCloudFileReferenceObject? image = null;
if (request.ImageId is not null)
{
var file = await files.GetFileAsync(new GetFileRequest { Id = request.ImageId });
if (file is null)
return BadRequest("Image not found");
sticker.ImageId = request.ImageId;
sticker.Image = CloudFileReferenceObject.FromProtoValue(file);
sticker.Image = SnCloudFileReferenceObject.FromProtoValue(file);
}
sticker = await st.UpdateStickerAsync(sticker, image);
@@ -298,7 +298,7 @@ public class StickerController(
return Unauthorized();
var permissionCheck =
await _CheckStickerPackPermissions(packId, currentUser, Publisher.PublisherMemberRole.Editor);
await _CheckStickerPackPermissions(packId, currentUser, Shared.Models.PublisherMemberRole.Editor);
if (permissionCheck is not OkResult)
return permissionCheck;
@@ -329,7 +329,7 @@ public class StickerController(
return BadRequest("Image is required.");
var permissionCheck =
await _CheckStickerPackPermissions(packId, currentUser, Publisher.PublisherMemberRole.Editor);
await _CheckStickerPackPermissions(packId, currentUser, Shared.Models.PublisherMemberRole.Editor);
if (permissionCheck is not OkResult)
return permissionCheck;
@@ -351,7 +351,7 @@ public class StickerController(
{
Slug = request.Slug,
ImageId = file.Id,
Image = CloudFileReferenceObject.FromProtoValue(file),
Image = SnCloudFileReferenceObject.FromProtoValue(file),
Pack = pack
};

View File

@@ -1,5 +1,5 @@
using DysonNetwork.Shared.Cache;
using DysonNetwork.Shared.Data;
using DysonNetwork.Shared.Models;
using DysonNetwork.Shared.Proto;
using Microsoft.EntityFrameworkCore;
@@ -33,7 +33,7 @@ public class StickerService(
return sticker;
}
public async Task<Sticker> UpdateStickerAsync(Sticker sticker, CloudFileReferenceObject? newImage)
public async Task<Sticker> UpdateStickerAsync(Sticker sticker, SnCloudFileReferenceObject? newImage)
{
if (newImage is not null)
{