aboutsummaryrefslogtreecommitdiff
path: root/BackEnd/Timeline/Services/User/Avatar/DefaultUserAvatarProvider.cs
blob: 9f8f1c6279444804b27c4e74f2661c70191722f4 (plain)
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using Microsoft.AspNetCore.Hosting;
using SixLabors.ImageSharp;
using System.IO;
using System.Threading.Tasks;
using Timeline.Helpers.Cache;
using Timeline.Models;
using Timeline.Services.Data;

namespace Timeline.Services.User.Avatar
{
    // TODO! : Make this configurable.
    public class DefaultUserAvatarProvider : IDefaultUserAvatarProvider
    {
        private readonly IETagGenerator _eTagGenerator;

        private readonly string _avatarPath;

        private CacheableDataDigest? _cacheDigest;
        private ByteData? _cacheData;

        public DefaultUserAvatarProvider(IWebHostEnvironment environment, IETagGenerator eTagGenerator)
        {
            _avatarPath = Path.Combine(environment.ContentRootPath, "default-avatar.png");
            _eTagGenerator = eTagGenerator;
        }

        private async Task CheckAndInit()
        {
            var path = _avatarPath;
            if (_cacheData == null || File.GetLastWriteTime(path) > _cacheDigest!.LastModified)
            {
                var data = await File.ReadAllBytesAsync(path);
                _cacheDigest = new CacheableDataDigest(await _eTagGenerator.GenerateETagAsync(data), File.GetLastWriteTime(path));
                Image.Identify(data, out var format);
                _cacheData = new ByteData(data, format.DefaultMimeType);
            }
        }

        public async Task<ICacheableDataDigest> GetDefaultAvatarDigest()
        {
            await CheckAndInit();
            return _cacheDigest!;
        }

        public async Task<ByteData> GetDefaultAvatar()
        {
            await CheckAndInit();
            return _cacheData!;
        }
    }
}