about summary refs log tree commit diff
path: root/LibMatrix/Homeservers/Extensions/NamedCaches/NamedFilterCache.cs
blob: 76533a4f52baa953b9c0e2b7e09eff4bc79a5ee5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using LibMatrix.Filters;
using LibMatrix.Utilities;

namespace LibMatrix.Homeservers.Extensions.NamedCaches;

public class NamedFilterCache(AuthenticatedHomeserverGeneric hs) : NamedCache<string>(hs, "gay.rory.libmatrix.named_cache.filter") {
    /// <summary>
    ///   <inheritdoc cref="NamedCache{T}.GetOrSetValueAsync"/>
    ///   Allows passing a filter directly, or using a common filter.
    ///   Substitutes @me for the user's ID.
    /// </summary>
    /// <param name="key">Filter name</param>
    /// <param name="filter">Filter to upload if not cached, otherwise defaults to common filters if that exists.</param>
    /// <returns></returns>
    /// <exception cref="ArgumentNullException"></exception>
    public async Task<string> GetOrSetValueAsync(string key, SyncFilter? filter = null) {
        var existingValue = await GetValueAsync(key);
        if (existingValue != null) {
            return existingValue;
        }

        if (filter is null) {
            if(CommonSyncFilters.FilterMap.TryGetValue(key, out var commonFilter)) {
                filter = commonFilter;
            } else {
                throw new ArgumentNullException(nameof(filter));
            }
        }

        var filterUpload = await hs.UploadFilterAsync(filter);
        return await SetValueAsync(key, filterUpload.FilterId);
    }
}