Example #1
0
        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);
        }
Example #2
0
        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();
Example #5
0
            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));
            }
Example #6
0
        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;
        }
Example #9
0
        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);
Example #11
0
 public IInteractor <IObservable <IThreadSafeTimeEntry> > UpdateTimeEntry(EditTimeEntryDto dto)
 => new UpdateTimeEntryInteractor(timeService, dataSource, dto);