aboutsummaryrefslogtreecommitdiff
path: root/Timeline/Services/TimelineService.cs
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2020-08-31 22:49:57 +0800
committerGitHub <noreply@github.com>2020-08-31 22:49:57 +0800
commit3e7e533016b04df4993df66842409cf5857983ee (patch)
tree187696f3303241177820ca65fa441655a03de257 /Timeline/Services/TimelineService.cs
parentb2404a381178e962a09af018d3c0031f1918991a (diff)
parent7e414fb4a09e6d35fa32d48fdba38a537ffe1d23 (diff)
downloadtimeline-3e7e533016b04df4993df66842409cf5857983ee.tar.gz
timeline-3e7e533016b04df4993df66842409cf5857983ee.tar.bz2
timeline-3e7e533016b04df4993df66842409cf5857983ee.zip
Merge pull request #158 from crupest/dev
Develop new features of back end.
Diffstat (limited to 'Timeline/Services/TimelineService.cs')
-rw-r--r--Timeline/Services/TimelineService.cs62
1 files changed, 61 insertions, 1 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);
+ }
}
}