using MongoDB.Bson; using MongoDB.Driver; using MongoDB.Entities; using PrivaPub.Models.Federation; using PrivaPub.Models.Group; using PrivaPub.Models.Post; using PrivaPub.Models.User; namespace PrivaPub.Infrastructure.Data { public static class Indexes { public static async Task Create(CancellationToken token = default) { await Unique(p => p.ObjectURI, Builders.Filter.Type(p => p.ObjectURI, BsonType.String), token); await Plain(token, p => p.GroupUserId, p => p.ID); await Plain(token, p => p.GroupId, p => p.ID); await Plain(token, p => p.ActorURI); await Unique(p => p.ObjectURI, Builders.Filter.Type(p => p.ObjectURI, BsonType.String), token); await Plain(token, p => p.GroupId, p => p.ID); await Unique(a => a.ActorURI, Builders.Filter.Type(a => a.ActorURI, BsonType.String), token); await Plain(token, a => a.PublicKeyId); await DB.Default.Index() .Key(f => f.LocalActorId, KeyType.Ascending) .Key(f => f.LocalActorKind, KeyType.Ascending) .Key(f => f.ActorURI, KeyType.Ascending) .Option(o => o.Unique = true) .CreateAsync(token); await Plain(token, f => f.ActorURI); await DB.Default.Index() .Key(r => r.RootId, KeyType.Ascending) .Key(r => r.AvatarId, KeyType.Ascending) .Option(o => o.Unique = true) .CreateAsync(token); await Plain(token, r => r.AvatarId); await Unique(r => r.Name, Builders.Filter.Type(r => r.Name, BsonType.String), token); await Unique(u => u.UserName, Builders.Filter.Type(u => u.UserName, BsonType.String), token); await Plain(token, a => a.UserName); await Plain(token, g => g.UserName); await Plain(token, g => g.InvitationCode); await Plain(token, g => g.ParticipantsKey); await Plain(token, d => d.DeliveredAt, d => d.AbandonedAt, d => d.NextAttemptAt); } static async Task Unique(System.Linq.Expressions.Expression> key, FilterDefinition partial, CancellationToken token) where T : IEntity => await DB.Default.Index() .Key(key, KeyType.Ascending) .Option(o => { o.Unique = true; o.PartialFilterExpression = partial; }) .CreateAsync(token); static async Task Plain(CancellationToken token, params System.Linq.Expressions.Expression>[] keys) where T : IEntity { var index = DB.Default.Index(); foreach (var key in keys) index.Key(key, KeyType.Ascending); await index.CreateAsync(token); } } }