:3
This commit is contained in:
@@ -0,0 +1,139 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using LiteDB;
|
||||
|
||||
namespace Mocha2023.Classes.DBs
|
||||
{
|
||||
|
||||
public static class PlayerEventDB
|
||||
{
|
||||
private static readonly LiteDatabase Database =
|
||||
new(Path.Combine(Program.dataDir, "DBs", "PlayerEvents.db"));
|
||||
|
||||
private static readonly ILiteCollection<PlayerEvent> Events =
|
||||
Database.GetCollection<PlayerEvent>("Events");
|
||||
private static readonly ILiteCollection<PlayerEventResponse> Responses =
|
||||
Database.GetCollection<PlayerEventResponse>("Responses");
|
||||
|
||||
private static readonly object Sync = new();
|
||||
|
||||
static PlayerEventDB()
|
||||
{
|
||||
LiteDbMaintenance.StartPeriodicCheckpoint("PlayerEvents.db", Database);
|
||||
Events.EnsureIndex(value => value.CreatorAccountId);
|
||||
Events.EnsureIndex(value => value.ClubId);
|
||||
Events.EnsureIndex(value => value.StartsAt);
|
||||
Responses.EnsureIndex(value => value.EventId);
|
||||
Responses.EnsureIndex(value => value.AccountId);
|
||||
}
|
||||
|
||||
public sealed class PlayerEvent
|
||||
{
|
||||
[BsonId]
|
||||
public long EventId { get; set; }
|
||||
public long CreatorAccountId { get; set; }
|
||||
public string Name { get; set; } = string.Empty;
|
||||
public string Description { get; set; } = string.Empty;
|
||||
public string ImageName { get; set; } = string.Empty;
|
||||
public DateTime StartsAt { get; set; }
|
||||
public DateTime? EndsAt { get; set; }
|
||||
public long? RoomId { get; set; }
|
||||
public long? ClubId { get; set; }
|
||||
|
||||
public string Accessibility { get; set; } = "Public";
|
||||
public bool MultiInstance { get; set; }
|
||||
public List<string> Tags { get; set; } = new();
|
||||
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
|
||||
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
|
||||
}
|
||||
|
||||
public sealed class PlayerEventResponse
|
||||
{
|
||||
[BsonId]
|
||||
public string Id { get; set; } = string.Empty;
|
||||
public long EventId { get; set; }
|
||||
public long AccountId { get; set; }
|
||||
|
||||
public string ResponseType { get; set; } = "Going";
|
||||
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
|
||||
}
|
||||
|
||||
private static string ResponseId(long eventId, long accountId) => $"{eventId}:{accountId}";
|
||||
|
||||
public static long GetNextEventId()
|
||||
{
|
||||
lock (Sync)
|
||||
return Events.Count() == 0 ? 1 : Events.Max(value => value.EventId) + 1;
|
||||
}
|
||||
|
||||
public static PlayerEvent Create(PlayerEvent evt)
|
||||
{
|
||||
lock (Sync)
|
||||
{
|
||||
evt.EventId = GetNextEventId();
|
||||
evt.CreatedAt = DateTime.UtcNow;
|
||||
evt.UpdatedAt = evt.CreatedAt;
|
||||
Events.Insert(evt);
|
||||
return evt;
|
||||
}
|
||||
}
|
||||
|
||||
public static PlayerEvent? Get(long eventId) => Events.FindById(eventId);
|
||||
|
||||
public static List<PlayerEvent> GetByIds(IEnumerable<long> ids)
|
||||
{
|
||||
var idSet = ids.ToHashSet();
|
||||
return Events.Find(value => idSet.Contains(value.EventId)).ToList();
|
||||
}
|
||||
|
||||
public static List<PlayerEvent> GetByCreator(long accountId) =>
|
||||
Events.Find(value => value.CreatorAccountId == accountId)
|
||||
.OrderByDescending(value => value.StartsAt)
|
||||
.ToList();
|
||||
|
||||
public static List<PlayerEvent> GetByClub(long clubId) =>
|
||||
Events.Find(value => value.ClubId == clubId)
|
||||
.OrderByDescending(value => value.StartsAt)
|
||||
.ToList();
|
||||
|
||||
public static bool Update(PlayerEvent evt)
|
||||
{
|
||||
evt.UpdatedAt = DateTime.UtcNow;
|
||||
return Events.Update(evt);
|
||||
}
|
||||
|
||||
public static bool Delete(long eventId)
|
||||
{
|
||||
lock (Sync)
|
||||
{
|
||||
Responses.DeleteMany(value => value.EventId == eventId);
|
||||
return Events.Delete(eventId);
|
||||
}
|
||||
}
|
||||
|
||||
public static PlayerEventResponse SetResponse(long eventId, long accountId, string responseType)
|
||||
{
|
||||
var response = new PlayerEventResponse
|
||||
{
|
||||
Id = ResponseId(eventId, accountId),
|
||||
EventId = eventId,
|
||||
AccountId = accountId,
|
||||
ResponseType = responseType,
|
||||
CreatedAt = DateTime.UtcNow
|
||||
};
|
||||
Responses.Upsert(response);
|
||||
return response;
|
||||
}
|
||||
|
||||
public static bool DeleteResponse(long eventId, long accountId) =>
|
||||
Responses.Delete(ResponseId(eventId, accountId));
|
||||
|
||||
public static List<PlayerEventResponse> GetResponses(long eventId) =>
|
||||
Responses.Find(value => value.EventId == eventId).ToList();
|
||||
|
||||
public static PlayerEventResponse? GetResponse(long eventId, long accountId) =>
|
||||
Responses.FindById(ResponseId(eventId, accountId));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user