1
0
mirror of https://github.com/mxpv/podsync.git synced 2024-05-11 05:55:04 +00:00

Save patreon id to database, use transaction when saving feed

This commit is contained in:
Maksym Pavlenko
2017-01-12 14:46:28 -08:00
parent 802932cdd7
commit 304ae01dcb
4 changed files with 53 additions and 27 deletions

View File

@@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Xml.Serialization; using System.Xml.Serialization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
@@ -62,8 +63,12 @@ namespace Podsync.Controllers
}; };
// Check if user eligible for Patreon features // Check if user eligible for Patreon features
var enablePatreonFeatures = User.EnablePatreonFeatures(); var allowFeatures = User.EnablePatreonFeatures();
if (!enablePatreonFeatures) if (allowFeatures)
{
feed.PatreonId = User.GetClaim(ClaimTypes.NameIdentifier);
}
else
{ {
feed.Quality = ResolveFormat.VideoHigh; feed.Quality = ResolveFormat.VideoHigh;
} }

View File

@@ -69,7 +69,7 @@ namespace Podsync.Helpers
?? "noname :("; ?? "noname :(";
} }
private static string GetClaim(this ClaimsPrincipal claimsPrincipal, string type) public static string GetClaim(this ClaimsPrincipal claimsPrincipal, string type)
{ {
return claimsPrincipal.Claims.FirstOrDefault(x => x.Type == type)?.Value; return claimsPrincipal.Claims.FirstOrDefault(x => x.Type == type)?.Value;
} }

View File

@@ -15,6 +15,11 @@ namespace Podsync.Services.Storage
public int PageSize { get; set; } public int PageSize { get; set; }
/// <summary>
/// User id on Patreon
/// </summary>
public string PatreonId { get; set; }
public override string ToString() => $"{Provider} ({LinkType}) {Id}"; public override string ToString() => $"{Provider} ({LinkType}) {Id}";
// Workaround for backward compatibility // Workaround for backward compatibility

View File

@@ -78,25 +78,22 @@ namespace Podsync.Services.Storage
{ {
var id = await MakeId(); var id = await MakeId();
if (await Db.KeyExistsAsync(id)) var t = Db.CreateTransaction();
t.AddCondition(Condition.KeyNotExists(id));
#pragma warning disable 4014
// We should not await here because of transaction
// See http://stackoverflow.com/questions/25976231/stackexchange-redis-transaction-methods-freezes
t.HashSetAsync(id, BuildSet(metadata).ToArray());
t.KeyExpireAsync(id, TimeSpan.FromDays(1));
#pragma warning restore 4014
var succeeded = await t.ExecuteAsync();
if (!succeeded)
{ {
throw new InvalidOperationException("Failed to generate feed id"); throw new InvalidOperationException("Failed to save feed");
} }
await Db.HashSetAsync(id, new[]
{
// V1
new HashEntry(nameof(metadata.Provider), metadata.Provider.ToString()),
new HashEntry(nameof(metadata.Type), metadata.Type.ToString()),
new HashEntry(nameof(metadata.Id), metadata.Id),
// V2
new HashEntry(nameof(metadata.Quality), metadata.Quality.ToString()),
new HashEntry(nameof(metadata.PageSize), metadata.PageSize),
});
await Db.KeyExpireAsync(id, TimeSpan.FromDays(1));
return id; return id;
} }
@@ -120,13 +117,14 @@ namespace Podsync.Services.Storage
var metadata = new FeedMetadata(); var metadata = new FeedMetadata();
// V1 // V1
SetProperty(metadata, x => x.Id, entries); UnpackProperty(metadata, x => x.Id, entries);
SetProperty(metadata, x => x.Type, entries); UnpackProperty(metadata, x => x.Type, entries);
SetProperty(metadata, x => x.Provider, entries); UnpackProperty(metadata, x => x.Provider, entries);
// V2 // V2
SetProperty(metadata, x => x.Quality, entries, Constants.DefaultFormat); UnpackProperty(metadata, x => x.Quality, entries, Constants.DefaultFormat);
SetProperty(metadata, x => x.PageSize, entries, Constants.DefaultPageSize); UnpackProperty(metadata, x => x.PageSize, entries, Constants.DefaultPageSize);
UnpackProperty(metadata, x => x.PatreonId, entries, null);
return metadata; return metadata;
} }
@@ -156,12 +154,12 @@ namespace Podsync.Services.Storage
return key; return key;
} }
private static void SetProperty<T, P>(T target, Expression<Func<T, P>> memberLamda, HashEntry[] entries) private static void UnpackProperty<T, P>(T target, Expression<Func<T, P>> memberLamda, HashEntry[] entries)
{ {
SetProperty(target, memberLamda, entries, default(P), true); UnpackProperty(target, memberLamda, entries, default(P), true);
} }
private static void SetProperty<T, P>(T target, Expression<Func<T, P>> memberLamda, HashEntry[] entries, P fallback, bool throwIfMissing = false) private static void UnpackProperty<T, P>(T target, Expression<Func<T, P>> memberLamda, HashEntry[] entries, P fallback, bool throwIfMissing = false)
{ {
var memberExpression = memberLamda.Body as MemberExpression; var memberExpression = memberLamda.Body as MemberExpression;
@@ -202,5 +200,23 @@ namespace Podsync.Services.Storage
var property = memberExpression.Member as PropertyInfo; var property = memberExpression.Member as PropertyInfo;
property?.SetValue(target, value); property?.SetValue(target, value);
} }
private IEnumerable<HashEntry> BuildSet(FeedMetadata metadata)
{
// V1.0
yield return new HashEntry(nameof(metadata.Provider), metadata.Provider.ToString());
yield return new HashEntry(nameof(metadata.Type), metadata.Type.ToString());
yield return new HashEntry(nameof(metadata.Id), metadata.Id);
// V2.0
yield return new HashEntry(nameof(metadata.Quality), metadata.Quality.ToString());
yield return new HashEntry(nameof(metadata.PageSize), metadata.PageSize);
// V2.1
if (!string.IsNullOrEmpty(metadata.PatreonId))
{
yield return new HashEntry(nameof(metadata.PatreonId), metadata.PatreonId);
}
}
} }
} }