✨ Sticker pack ownerships
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Text.Json.Serialization;
|
||||
using DysonNetwork.Pass.Account;
|
||||
using DysonNetwork.Shared.Data;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
@@ -13,11 +15,11 @@ public class Sticker : ModelBase, IIdentifiedResource
|
||||
|
||||
// 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; }
|
||||
public StickerPack Pack { get; set; } = null!;
|
||||
[JsonIgnore] public StickerPack Pack { get; set; } = null!;
|
||||
|
||||
public string ResourceIdentifier => $"sticker:{Id}";
|
||||
}
|
||||
@@ -29,8 +31,19 @@ public class StickerPack : ModelBase
|
||||
[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; } = new();
|
||||
|
||||
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 Account Account { get; set; } = null!;
|
||||
}
|
||||
|
@@ -3,6 +3,7 @@ using DysonNetwork.Shared.Auth;
|
||||
using DysonNetwork.Shared.Data;
|
||||
using DysonNetwork.Shared.Proto;
|
||||
using DysonNetwork.Sphere.Publisher;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
@@ -61,6 +62,25 @@ public class StickerController(AppDatabase db, StickerService st, FileService.Fi
|
||||
return Ok(packs);
|
||||
}
|
||||
|
||||
[HttpGet("me")]
|
||||
[Authorize]
|
||||
public async Task<ActionResult<List<StickerPackOwnership>>> ListStickerPacksOwned()
|
||||
{
|
||||
if (HttpContext.Items["CurrentUser"] is not Account currentUser) return Unauthorized();
|
||||
var accountId = Guid.Parse(currentUser.Id);
|
||||
|
||||
var ownershipsId = await db.StickerPackOwnerships
|
||||
.Where(p => p.AccountId == accountId)
|
||||
.Select(p => p.PackId)
|
||||
.ToListAsync();
|
||||
var packs = await db.StickerPacks
|
||||
.Where(p => ownershipsId.Contains(p.Id))
|
||||
.Include(p => p.Stickers)
|
||||
.ToListAsync();
|
||||
|
||||
return Ok(packs);
|
||||
}
|
||||
|
||||
[HttpGet("{id:guid}")]
|
||||
public async Task<ActionResult<StickerPack>> GetStickerPack(Guid id)
|
||||
{
|
||||
@@ -318,4 +338,46 @@ public class StickerController(AppDatabase db, StickerService st, FileService.Fi
|
||||
sticker = await st.CreateStickerAsync(sticker);
|
||||
return Ok(sticker);
|
||||
}
|
||||
}
|
||||
|
||||
[HttpPost("{packId:guid}/own")]
|
||||
[Authorize]
|
||||
public async Task<ActionResult<StickerPackOwnership>> AcquireStickerPack([FromRoute] Guid packId)
|
||||
{
|
||||
if (HttpContext.Items["CurrentUser"] is not Account currentUser)
|
||||
return Unauthorized();
|
||||
|
||||
var pack = await db.StickerPacks
|
||||
.Where(p => p.Id == packId)
|
||||
.FirstOrDefaultAsync();
|
||||
if (pack is null) return NotFound();
|
||||
|
||||
var ownership = new StickerPackOwnership
|
||||
{
|
||||
PackId = packId,
|
||||
AccountId = Guid.Parse(currentUser.Id)
|
||||
};
|
||||
db.StickerPackOwnerships.Add(ownership);
|
||||
await db.SaveChangesAsync();
|
||||
|
||||
return Ok(ownership);
|
||||
}
|
||||
|
||||
[HttpDelete("{packId:guid}/own")]
|
||||
[Authorize]
|
||||
public async Task<IActionResult> ReleaseStickerPack([FromRoute] Guid packId)
|
||||
{
|
||||
if (HttpContext.Items["CurrentUser"] is not Account currentUser)
|
||||
return Unauthorized();
|
||||
var accountId = Guid.Parse(currentUser.Id);
|
||||
|
||||
var ownership = await db.StickerPackOwnerships
|
||||
.Where(p => p.PackId == packId && p.AccountId == accountId)
|
||||
.FirstOrDefaultAsync();
|
||||
if (ownership is null) return NotFound();
|
||||
|
||||
db.Remove(ownership);
|
||||
await db.SaveChangesAsync();
|
||||
|
||||
return NoContent();
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user