diff options
author | crupest <crupest@outlook.com> | 2020-08-31 22:49:57 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-31 22:49:57 +0800 |
commit | edfefcf9bdbf5ba186a8f2c7d021acf04dbbb329 (patch) | |
tree | fdd69c951f68cda72ac1cbf017ca272ee1b783f5 /Timeline/Services | |
parent | 1886b3411c69d8eb4fffbbfe29eb3a917d04e2f4 (diff) | |
parent | ff90e2819a1c0b7d1b605b45edaaaee7527c05b1 (diff) | |
download | timeline-edfefcf9bdbf5ba186a8f2c7d021acf04dbbb329.tar.gz timeline-edfefcf9bdbf5ba186a8f2c7d021acf04dbbb329.tar.bz2 timeline-edfefcf9bdbf5ba186a8f2c7d021acf04dbbb329.zip |
Merge pull request #158 from crupest/dev
Develop new features of back end.
Diffstat (limited to 'Timeline/Services')
-rw-r--r-- | Timeline/Services/TimelineService.cs | 62 | ||||
-rw-r--r-- | Timeline/Services/UserAvatarService.cs | 14 |
2 files changed, 68 insertions, 8 deletions
diff --git a/Timeline/Services/TimelineService.cs b/Timeline/Services/TimelineService.cs index 01f7f5fd..4bcae596 100644 --- a/Timeline/Services/TimelineService.cs +++ b/Timeline/Services/TimelineService.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic;
using System.Globalization;
using System.Linq;
+using System.Threading;
using System.Threading.Tasks;
using Timeline.Entities;
using Timeline.Helpers;
@@ -357,6 +358,21 @@ namespace Timeline.Services /// <exception cref="ArgumentException">Thrown when timeline name is invalid.</exception>
/// <exception cref="TimelineNotExistException">Thrown when the timeline does not exist.</exception>
Task DeleteTimeline(string timelineName);
+
+ /// <summary>
+ /// Change name of a timeline.
+ /// </summary>
+ /// <param name="oldTimelineName">The old timeline name.</param>
+ /// <param name="newTimelineName">The new timeline name.</param>
+ /// <returns>The new timeline info.</returns>
+ /// <exception cref="ArgumentNullException">Thrown when <paramref name="oldTimelineName"/> or <paramref name="newTimelineName"/> is null.</exception>
+ /// <exception cref="ArgumentException">Thrown when <paramref name="oldTimelineName"/> or <paramref name="newTimelineName"/> is of invalid format.</exception>
+ /// <exception cref="TimelineNotExistException">Thrown when timeline does not exist.</exception>
+ /// <exception cref="EntityAlreadyExistException">Thrown when a timeline with new name already exists.</exception>
+ /// <remarks>
+ /// You can only change name of general timeline.
+ /// </remarks>
+ Task<Models.Timeline> ChangeTimelineName(string oldTimelineName, string newTimelineName);
}
public class TimelineService : ITimelineService
@@ -395,6 +411,7 @@ namespace Timeline.Services }
}
+ /// Remember to include Members when query.
private async Task<Models.Timeline> MapTimelineFromEntity(TimelineEntity entity)
{
var owner = await _userService.GetUserById(entity.OwnerId);
@@ -405,11 +422,14 @@ namespace Timeline.Services members.Add(await _userService.GetUserById(memberEntity.UserId));
}
+ var name = entity.Name ?? ("@" + owner.Username);
+
return new Models.Timeline
{
UniqueID = entity.UniqueId,
- Name = entity.Name ?? ("@" + owner.Username),
+ Name = name,
NameLastModified = entity.NameLastModified,
+ Title = string.IsNullOrEmpty(entity.Title) ? name : entity.Title,
Description = entity.Description ?? "",
Owner = owner,
Visibility = entity.Visibility,
@@ -834,6 +854,12 @@ namespace Timeline.Services var changed = false;
+ if (newProperties.Title != null)
+ {
+ changed = true;
+ timelineEntity.Title = newProperties.Title;
+ }
+
if (newProperties.Description != null)
{
changed = true;
@@ -1102,5 +1128,39 @@ namespace Timeline.Services _database.Timelines.Remove(entity);
await _database.SaveChangesAsync();
}
+
+ public async Task<Models.Timeline> ChangeTimelineName(string oldTimelineName, string newTimelineName)
+ {
+ if (oldTimelineName == null)
+ throw new ArgumentNullException(nameof(oldTimelineName));
+ if (newTimelineName == null)
+ throw new ArgumentNullException(nameof(newTimelineName));
+
+ ValidateTimelineName(oldTimelineName, nameof(oldTimelineName));
+ ValidateTimelineName(newTimelineName, nameof(newTimelineName));
+
+ var entity = await _database.Timelines.Include(t => t.Members).Where(t => t.Name == oldTimelineName).SingleOrDefaultAsync();
+
+ if (entity == null)
+ throw new TimelineNotExistException(oldTimelineName);
+
+ if (oldTimelineName == newTimelineName)
+ return await MapTimelineFromEntity(entity);
+
+ var conflict = await _database.Timelines.AnyAsync(t => t.Name == newTimelineName);
+
+ if (conflict)
+ throw new EntityAlreadyExistException(EntityNames.Timeline, null, ExceptionTimelineNameConflict);
+
+ var now = _clock.GetCurrentTime();
+
+ entity.Name = newTimelineName;
+ entity.NameLastModified = now;
+ entity.LastModified = now;
+
+ await _database.SaveChangesAsync();
+
+ return await MapTimelineFromEntity(entity);
+ }
}
}
diff --git a/Timeline/Services/UserAvatarService.cs b/Timeline/Services/UserAvatarService.cs index 2bf8bddc..b41c45fd 100644 --- a/Timeline/Services/UserAvatarService.cs +++ b/Timeline/Services/UserAvatarService.cs @@ -71,9 +71,10 @@ namespace Timeline.Services /// </summary>
/// <param name="id">The id of the user to set avatar for.</param>
/// <param name="avatar">The avatar. Can be null to delete the saved avatar.</param>
+ /// <returns>The etag of the avatar.</returns>
/// <exception cref="ArgumentException">Thrown if any field in <paramref name="avatar"/> is null when <paramref name="avatar"/> is not null.</exception>
/// <exception cref="ImageException">Thrown if avatar is of bad format.</exception>
- Task SetAvatar(long id, Avatar? avatar);
+ Task<string> SetAvatar(long id, Avatar? avatar);
}
// TODO! : Make this configurable.
@@ -199,7 +200,7 @@ namespace Timeline.Services return defaultAvatar;
}
- public async Task SetAvatar(long id, Avatar? avatar)
+ public async Task<string> SetAvatar(long id, Avatar? avatar)
{
if (avatar != null)
{
@@ -213,11 +214,7 @@ namespace Timeline.Services if (avatar == null)
{
- if (avatarEntity == null || avatarEntity.DataTag == null)
- {
- return;
- }
- else
+ if (avatarEntity != null && avatarEntity.DataTag != null)
{
await _dataManager.FreeEntry(avatarEntity.DataTag);
avatarEntity.DataTag = null;
@@ -226,6 +223,7 @@ namespace Timeline.Services await _database.SaveChangesAsync();
_logger.LogInformation(Resources.Services.UserAvatarService.LogUpdateEntity);
}
+ return await _defaultUserAvatarProvider.GetDefaultAvatarETag();
}
else
{
@@ -250,6 +248,8 @@ namespace Timeline.Services {
await _dataManager.FreeEntry(oldTag);
}
+
+ return avatarEntity.DataTag;
}
}
}
|