diff --git a/server/AyaNova/Controllers/ScheduleController.cs b/server/AyaNova/Controllers/ScheduleController.cs
index 41bbc3a5..776efde2 100644
--- a/server/AyaNova/Controllers/ScheduleController.cs
+++ b/server/AyaNova/Controllers/ScheduleController.cs
@@ -83,6 +83,48 @@ namespace AyaNova.Api.Controllers
return Ok(ApiOkResponse.Response(r));
}
+ ///
+ /// Adjust a schedule item's start / end timestamp
+ ///
+ /// Adjustment parameters parameters
+ /// From route path
+ /// Error or OK response
+ [HttpPost("adjust")]
+ public async Task PostPersonalSchedule([FromBody] ScheduleItemAdjustParams ad, ApiVersion apiVersion)
+ {
+ if (!serverState.IsOpen)
+ return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
+ if (!ModelState.IsValid)
+ return BadRequest(new ApiErrorResponse(ModelState));
+
+ switch (ad.Type)
+ {
+ case AyaType.WorkOrderItemScheduledUser:
+ {
+ WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext);
+ if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.WorkOrderItemScheduledUser) || biz.UserIsRestrictedType)
+ return StatusCode(403, new ApiNotAuthorizedResponse());
+ var o = await biz.ScheduledUserPutNewScheduleTimeAsync(ad);
+ if (o == false)
+ {
+ if (biz.Errors.Exists(z => z.Code == ApiErrorCode.CONCURRENCY_CONFLICT))
+ return StatusCode(409, new ApiErrorResponse(biz.Errors));
+ else
+ return BadRequest(new ApiErrorResponse(biz.Errors));
+ }
+ }
+ break;
+ default:
+ return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_INVALID_VALUE, "Type", "Type not supported for adjustment"));
+ }
+
+ //a-ok response
+ return Ok(ApiOkResponse.Response(true));
+ }
+
+
+
+ //#### UTILITY METHODS ##############
private static PersonalScheduleListItem MakeWOSchedItem(ViewSchedulePersonalWorkOrder v, PersonalScheduleParams p)
{
var s = new PersonalScheduleListItem();
@@ -176,8 +218,9 @@ namespace AyaNova.Api.Controllers
public string TextColor { get; set; }
public AyaType Type { get; set; }
public long Id { get; set; }
-
}
+
+
//------------
diff --git a/server/AyaNova/biz/WorkOrderBiz.cs b/server/AyaNova/biz/WorkOrderBiz.cs
index 18037fc5..5926736f 100644
--- a/server/AyaNova/biz/WorkOrderBiz.cs
+++ b/server/AyaNova/biz/WorkOrderBiz.cs
@@ -4868,6 +4868,42 @@ namespace AyaNova.Biz
return putObject;
}
+ ////////////////////////////////////////////////////////////////////////////////////////////////
+ //UPDATE schedule only
+ //
+ internal async Task ScheduledUserPutNewScheduleTimeAsync(ScheduleItemAdjustParams p)
+ {
+ WorkOrderItemScheduledUser dbObject = await ct.WorkOrderItemScheduledUser.SingleOrDefaultAsync(z => z.Id == p.Id);
+ if (dbObject == null)
+ {
+ AddError(ApiErrorCode.NOT_FOUND, "id");
+ return false;
+ }
+
+ dbObject.StartDate = p.Start;
+ dbObject.StopDate = p.End;
+
+ await ScheduledUserValidateAsync(dbObject, dbObject);
+ if (HasErrors) return false;
+ // ct.Replace(dbObject, putObject);
+ try
+ {
+ await ct.SaveChangesAsync();
+ }
+ catch (DbUpdateConcurrencyException)
+ {
+ if (!await ScheduledUserExistsAsync(dbObject.Id))
+ AddError(ApiErrorCode.NOT_FOUND);
+ else
+ AddError(ApiErrorCode.CONCURRENCY_CONFLICT);
+ return false;
+ }
+ await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, dbObject.AyaType, AyaEvent.Modified), ct);
+ await ScheduledUserPopulateVizFields(dbObject);
+ await ScheduledUserHandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, dbObject);
+ return true;
+ }
+
////////////////////////////////////////////////////////////////////////////////////////////////
//DELETE
//
diff --git a/server/AyaNova/models/dto/ScheduleItemAdjustParams.cs b/server/AyaNova/models/dto/ScheduleItemAdjustParams.cs
new file mode 100644
index 00000000..b8a50b39
--- /dev/null
+++ b/server/AyaNova/models/dto/ScheduleItemAdjustParams.cs
@@ -0,0 +1,13 @@
+using System;
+using AyaNova.Biz;
+
+namespace AyaNova.Models
+{
+ public class ScheduleItemAdjustParams
+ {
+ public AyaType Type { get; set; }
+ public long Id { get; set; }
+ public DateTime Start { get; set; }
+ public DateTime End { get; set; }
+ }
+}
\ No newline at end of file