diff --git a/server/AyaNova/Controllers/ReportController.cs b/server/AyaNova/Controllers/ReportController.cs
index 68910f7f..8d964869 100644
--- a/server/AyaNova/Controllers/ReportController.cs
+++ b/server/AyaNova/Controllers/ReportController.cs
@@ -41,6 +41,123 @@ namespace AyaNova.Api.Controllers
+
+
+ ///
+ /// Create Report
+ ///
+ ///
+ /// From route path
+ ///
+ [HttpPost]
+ public async Task PostReport([FromBody] Report newObject, ApiVersion apiVersion)
+ {
+ if (!serverState.IsOpen)
+ return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
+ ReportBiz biz = ReportBiz.GetBiz(ct, HttpContext);
+ if (!Authorized.HasCreateRole(HttpContext.Items, biz.BizType))
+ return StatusCode(403, new ApiNotAuthorizedResponse());
+ if (!ModelState.IsValid)
+ return BadRequest(new ApiErrorResponse(ModelState));
+ Report o = await biz.CreateAsync(newObject);
+ if (o == null)
+ return BadRequest(new ApiErrorResponse(biz.Errors));
+ else
+ return CreatedAtAction(nameof(ReportController.GetReport), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o));
+ }
+
+ ///
+ /// Duplicate Report
+ /// (Wiki and Attachments are not duplicated)
+ ///
+ /// Source object id
+ /// From route path
+ /// Report
+ [HttpPost("duplicate/{id}")]
+ public async Task DuplicateReport([FromRoute] long id, ApiVersion apiVersion)
+ {
+ if (!serverState.IsOpen)
+ return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
+ ReportBiz biz = ReportBiz.GetBiz(ct, HttpContext);
+ if (!Authorized.HasCreateRole(HttpContext.Items, biz.BizType))
+ return StatusCode(403, new ApiNotAuthorizedResponse());
+ if (!ModelState.IsValid)
+ return BadRequest(new ApiErrorResponse(ModelState));
+ Report o = await biz.DuplicateAsync(id);
+ if (o == null)
+ return BadRequest(new ApiErrorResponse(biz.Errors));
+ else
+ return CreatedAtAction(nameof(ReportController.GetReport), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o));
+ }
+
+ ///
+ /// Get Report
+ ///
+ ///
+ /// Report
+ [HttpGet("{id}")]
+ public async Task GetReport([FromRoute] long id)
+ {
+ if (!serverState.IsOpen)
+ return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
+ ReportBiz biz = ReportBiz.GetBiz(ct, HttpContext);
+ if (!Authorized.HasReadFullRole(HttpContext.Items, biz.BizType))
+ return StatusCode(403, new ApiNotAuthorizedResponse());
+ if (!ModelState.IsValid)
+ return BadRequest(new ApiErrorResponse(ModelState));
+ var o = await biz.GetAsync(id);
+ if (o == null) return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND));
+ return Ok(ApiOkResponse.Response(o));
+ }
+
+ ///
+ /// Put (update) Report
+ ///
+ ///
+ ///
+ [HttpPut]
+ public async Task PutReport([FromBody] Report updatedObject)
+ {
+ if (!serverState.IsOpen)
+ return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
+ if (!ModelState.IsValid)
+ return BadRequest(new ApiErrorResponse(ModelState));
+ ReportBiz biz = ReportBiz.GetBiz(ct, HttpContext);
+ if (!Authorized.HasModifyRole(HttpContext.Items, biz.BizType))
+ return StatusCode(403, new ApiNotAuthorizedResponse());
+ var o = await biz.PutAsync(updatedObject);//In future may need to return entire object, for now just concurrency token
+ if (o == null)
+ {
+ if (biz.Errors.Exists(z => z.Code == ApiErrorCode.CONCURRENCY_CONFLICT))
+ return StatusCode(409, new ApiErrorResponse(biz.Errors));
+ else
+ return BadRequest(new ApiErrorResponse(biz.Errors));
+ }
+ return Ok(ApiOkResponse.Response(new { Concurrency = o.Concurrency })); ;
+ }
+
+ ///
+ /// Delete Report
+ ///
+ ///
+ /// NoContent
+ [HttpDelete("{id}")]
+ public async Task DeleteReport([FromRoute] long id)
+ {
+ if (!serverState.IsOpen)
+ return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
+ if (!ModelState.IsValid)
+ return BadRequest(new ApiErrorResponse(ModelState));
+ ReportBiz biz = ReportBiz.GetBiz(ct, HttpContext);
+ if (!Authorized.HasDeleteRole(HttpContext.Items, biz.BizType))
+ return StatusCode(403, new ApiNotAuthorizedResponse());
+ if (!await biz.DeleteAsync(id))
+ return BadRequest(new ApiErrorResponse(biz.Errors));
+ return NoContent();
+ }
+
+
+
[HttpGet("render-test")]
[AllowAnonymous]
public async Task GetTestReport([FromRoute] string test)
@@ -81,7 +198,7 @@ namespace AyaNova.Api.Controllers
{
//https://test.helloayanova.com/api/v8/report/poc
//http://localhost:7575/api/v8/report/poc
-
+
if (!serverState.IsOpen)
return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
diff --git a/server/AyaNova/biz/ReportBiz.cs b/server/AyaNova/biz/ReportBiz.cs
index 967df879..05c62bc1 100644
--- a/server/AyaNova/biz/ReportBiz.cs
+++ b/server/AyaNova/biz/ReportBiz.cs
@@ -163,7 +163,7 @@ namespace AyaNova.Biz
private async Task SearchIndexAsync(Report obj, bool isNew)
{
var SearchParams = new Search.SearchIndexProcessObjectParameters(UserTranslationId, obj.Id, BizType);
- SearchParams.AddText(obj.Notes).AddText(obj.Name).AddText(obj.Wiki).AddText(obj.Tags).AddCustomFields(obj.CustomFields);
+ SearchParams.AddText(obj.Notes).AddText(obj.Name);
if (isNew)
await Search.ProcessNewObjectKeywordsAsync(SearchParams);
else
@@ -175,7 +175,7 @@ namespace AyaNova.Biz
var obj = await ct.Report.SingleOrDefaultAsync(z => z.Id == id);
var SearchParams = new Search.SearchIndexProcessObjectParameters();
if (obj != null)
- SearchParams.AddText(obj.Notes).AddText(obj.Name).AddText(obj.Wiki).AddText(obj.Tags).AddCustomFields(obj.CustomFields);
+ SearchParams.AddText(obj.Notes).AddText(obj.Name);
return SearchParams;
}
@@ -211,7 +211,7 @@ namespace AyaNova.Biz
private async void ValidateCanDelete(Report inObj)
{
-
+
//TODO: this is shitty, needs to mention notifications to be maximally useful
if (await ct.NotifySubscription.AnyAsync(z => z.AttachReportId == inObj.Id) == true)
{
@@ -222,6 +222,17 @@ namespace AyaNova.Biz
}
+ ////////////////////////////////////////////////////////////////////////////////////////////////
+ //RENDER
+ //
+ /*
+ Both a route (for external calls) that returns a report and an internal biz object that is used by notification for the same purpose
+ so the route just calls the biz object which handles processing, getting data, checking rights and then making the report and either attaching it to an email (maybe I do need that temp server folder after all)
+ or return to route to return to Client end
+ */
+
+
+
////////////////////////////////////////////////////////////////////////////////////////////////
//JOB / OPERATIONS
//