private async Task save() { OnboardingStorage.EditedTimeEntry(); var timeEntries = await interactorFactory.GetMultipleTimeEntriesById(TimeEntryIds).Execute(); var duration = await durationSubject.FirstAsync(); var commonTimeEntryData = new EditTimeEntryDto { Id = TimeEntryIds.First(), Description = Description.Value?.Trim() ?? string.Empty, StartTime = startTimeSubject.Value, StopTime = calculateStopTime(startTimeSubject.Value, duration), ProjectId = projectId, TaskId = taskId, Billable = isBillableSubject.Value, WorkspaceId = workspaceId, TagIds = tagIds.ToArray() }; var timeEntriesDtos = timeEntries .Select(timeEntry => applyDataFromTimeEntry(commonTimeEntryData, timeEntry)) .ToArray(); interactorFactory .UpdateMultipleTimeEntries(timeEntriesDtos) .Execute() .SubscribeToErrorsAndCompletion((Exception ex) => close(), () => close()) .DisposedBy(disposeBag); }
private EditTimeEntryDto applyDataFromTimeEntry(EditTimeEntryDto commonTimeEntryData, IThreadSafeTimeEntry timeEntry) { commonTimeEntryData.Id = timeEntry.Id; if (IsEditingGroup) { // start and end times can't be changed when editing a group of time entries commonTimeEntryData.StartTime = timeEntry.Start; commonTimeEntryData.StopTime = calculateStopTime(timeEntry.Start, timeEntry.TimeSpanDuration()); } return(commonTimeEntryData); }
public UpdateTimeEntryInteractor( ITimeService timeService, ITogglDataSource dataSource, EditTimeEntryDto dto) { Ensure.Argument.IsNotNull(dto, nameof(dto)); Ensure.Argument.IsNotNull(dataSource, nameof(dataSource)); Ensure.Argument.IsNotNull(timeService, nameof(timeService)); this.dto = dto; this.dataSource = dataSource; this.timeService = timeService; }
private TimeEntry createUpdatedTimeEntry(IThreadSafeTimeEntry timeEntry, EditTimeEntryDto dto) => TimeEntry.Builder.Create(dto.Id) .SetDescription(dto.Description) .SetDuration(dto.StopTime.HasValue ? (long?)(dto.StopTime.Value - dto.StartTime).TotalSeconds : null) .SetTagIds(dto.TagIds) .SetStart(dto.StartTime) .SetTaskId(dto.TaskId) .SetBillable(dto.Billable) .SetProjectId(dto.ProjectId) .SetWorkspaceId(dto.WorkspaceId) .SetUserId(timeEntry.UserId) .SetIsDeleted(timeEntry.IsDeleted) .SetServerDeletedAt(timeEntry.ServerDeletedAt) .SetAt(timeService.CurrentDateTime) .SetSyncStatus(SyncStatus.SyncNeeded) .Build();
public async ThreadingTask NotifiesAboutTheUpdate() { var observable = Observable.Return(DatabaseTimeEntry); Repository.GetById(Arg.Is(DatabaseTimeEntry.Id)).Returns(observable); var dto = new EditTimeEntryDto { Id = DatabaseTimeEntry.Id, Description = "New description", StartTime = DateTimeOffset.UtcNow, WorkspaceId = 71 }; var observer = Substitute.For <IObserver <(long, IDatabaseTimeEntry)> >(); TimeEntriesSource.TimeEntryUpdated.Subscribe(observer); await TimeEntriesSource.Update(dto); observer.Received().OnNext(Arg.Is <(long Id, IDatabaseTimeEntry)>(te => te.Id == dto.Id)); }
public static async Task Update(this DeeplinkUpdateTimeEntryParameters parameters, IInteractorFactory interactorFactory, ITimeService timeService) { var timeEntryId = parameters.TimeEntryId; var workspaceId = parameters.WorkspaceId; var startTime = parameters.StartTime ?? timeService.CurrentDateTime; var stopTime = parameters.StopTime; var description = parameters.Description; var projectId = parameters.ProjectId; var taskId = parameters.TaskId; var tagIds = parameters.TagIds; var isBillable = parameters.IsBillable ?? false; var timeEntryToUpdate = await interactorFactory.GetTimeEntryById(timeEntryId).Execute(); if (!workspaceId.HasValue) { var defaultWorkspace = await interactorFactory.GetDefaultWorkspace().Execute(); workspaceId = defaultWorkspace.Id; } var newWorkspaceId = parameters.HasWorkspaceId ? workspaceId.Value : timeEntryToUpdate.WorkspaceId; var newStartTime = parameters.HasStartTime ? startTime : timeEntryToUpdate.Start; var newStopTime = parameters.HasStopTime ? stopTime : timeEntryToUpdate.StopTime(); var newDescription = parameters.HasDescription ? description : timeEntryToUpdate.Description; var newProjectId = parameters.HasProjectId ? projectId : timeEntryToUpdate.ProjectId; var newTaskId = parameters.HasTaskId ? taskId : timeEntryToUpdate.TaskId; var newTagIds = parameters.HasTagIds ? tagIds : timeEntryToUpdate.TagIds; var newIsBillable = parameters.HasIsBillable ? isBillable : timeEntryToUpdate.Billable; var editTimeEntryDto = new EditTimeEntryDto { Id = timeEntryId, WorkspaceId = newWorkspaceId, StartTime = newStartTime, StopTime = newStopTime, Description = newDescription, ProjectId = newProjectId, TaskId = newTaskId, TagIds = newTagIds, Billable = newIsBillable, }; await interactorFactory.UpdateTimeEntry(editTimeEntryDto).Execute(); }
private EditTimeEntryDto prepareTest() { var observable = Observable.Return(timeEntry); DataSource.TimeEntries.GetById(Arg.Is(timeEntry.Id)).Returns(observable); var dto = new EditTimeEntryDto { Id = timeEntry.Id, Description = "New description", StartTime = DateTimeOffset.UtcNow, ProjectId = 13, Billable = true, WorkspaceId = 71, TagIds = new long[] { 1, 10, 34, 42 } }; return(dto); }
public UpdateTimeEntryInteractor( ITimeService timeService, ITogglDataSource dataSource, IInteractorFactory interactorFactory, ISyncManager syncManager, EditTimeEntryDto dto) { Ensure.Argument.IsNotNull(dto, nameof(dto)); Ensure.Argument.IsNotNull(dataSource, nameof(dataSource)); Ensure.Argument.IsNotNull(timeService, nameof(timeService)); Ensure.Argument.IsNotNull(interactorFactory, nameof(interactorFactory)); Ensure.Argument.IsNotNull(syncManager, nameof(syncManager)); this.dto = dto; this.dataSource = dataSource; this.timeService = timeService; this.interactorFactory = interactorFactory; this.syncManager = syncManager; }
private async Task save() { var reason = await isDirty() ? EditViewCloseReason.Save : EditViewCloseReason.SaveWithoutChange; OnboardingStorage.EditedTimeEntry(); var timeEntries = await interactorFactory .GetMultipleTimeEntriesById(TimeEntryIds).Execute(); var duration = await durationSubject.FirstAsync(); var commonTimeEntryData = new EditTimeEntryDto { Id = TimeEntryIds.First(), Description = Description.Value?.Trim() ?? string.Empty, StartTime = startTimeSubject.Value, StopTime = calculateStopTime(startTimeSubject.Value, duration), ProjectId = projectId, TaskId = taskId, Billable = isBillableSubject.Value, WorkspaceId = workspaceId, TagIds = tagIds.ToArray() }; var timeEntriesDtos = timeEntries .Select(timeEntry => applyDataFromTimeEntry(commonTimeEntryData, timeEntry)) .ToArray(); close(reason); await interactorFactory .UpdateMultipleTimeEntries(timeEntriesDtos) .Execute() .Catch(Observable.Empty <IEnumerable <IThreadSafeTimeEntry> >()) .SubscribeOn(schedulerProvider.BackgroundScheduler); }
public IObservable <IThreadSafeTimeEntry> Update(EditTimeEntryDto dto) => GetById(dto.Id) .Select(te => createUpdatedTimeEntry(te, dto)) .SelectMany(Update);
public IInteractor <IObservable <IThreadSafeTimeEntry> > UpdateTimeEntry(EditTimeEntryDto dto) => new UpdateTimeEntryInteractor(timeService, dataSource, dto);