This commit is contained in:
2020-07-30 20:39:38 +00:00
parent 129eafa64c
commit dfa47ab89f
8 changed files with 125 additions and 61 deletions

2
.vscode/launch.json vendored
View File

@@ -51,7 +51,7 @@
"AYANOVA_USE_URLS": "http://*:7575;",
"AYANOVA_FOLDER_USER_FILES": "c:\\temp\\RavenTestData\\userfiles",
"AYANOVA_FOLDER_BACKUP_FILES": "c:\\temp\\RavenTestData\\backupfiles",
"AYANOVA_SERVER_TEST_MODE":"true",
"AYANOVA_SERVER_TEST_MODE":"false",
"AYANOVA_SERVER_TEST_MODE_SEEDLEVEL":"small",
"AYANOVA_SERVER_TEST_MODE_TZ_OFFSET":"-7",
"AYANOVA_BACKUP_PG_DUMP_PATH":"C:\\data\\code\\PostgreSQLPortable_12.0\\App\\PgSQL\\bin\\"

View File

@@ -216,7 +216,7 @@ namespace AyaNova.Api.Controllers
}
}
/// <summary>
/// <summary>
/// Duplicate User
/// (Wiki and Attachments are not duplicated)
/// </summary>
@@ -245,38 +245,19 @@ namespace AyaNova.Api.Controllers
/// Delete User
/// </summary>
/// <param name="id"></param>
/// <returns>Ok</returns>
/// <returns>NoContent</returns>
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteUser([FromRoute] long id)
{
if (!serverState.IsOpen)
return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
if (!ModelState.IsValid)
{
return BadRequest(new ApiErrorResponse(ModelState));
}
//Instantiate the business object handler
UserBiz biz = UserBiz.GetBiz(ct, HttpContext);
var dbObject = await ct.User.SingleOrDefaultAsync(z => z.Id == id);
if (dbObject == null)
{
return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND));
}
if (!Authorized.HasDeleteRole(HttpContext.Items, biz.BizType))
{
return StatusCode(403, new ApiNotAuthorizedResponse());
}
if (!await biz.DeleteAsync(dbObject))
{
if (!await biz.DeleteAsync(id))
return BadRequest(new ApiErrorResponse(biz.Errors));
}
return NoContent();
}

View File

@@ -40,6 +40,13 @@ namespace AyaNova.Biz
return await ct.PM.AnyAsync(z => z.Id == id);
}
//###################################################################################################################################################
//###################################################################################################################################################
// WARNING! THIS OBJECT IS AN INITIAL TEST VERSION NOT UP TO CURRENT STANDARDS, SEE WORKORDERBIZ FOR HOW THIS SHOULD BE CODED
//###################################################################################################################################################
//###################################################################################################################################################
////////////////////////////////////////////////////////////////////////////////////////////////
/// GET
///
@@ -140,6 +147,13 @@ namespace AyaNova.Biz
}
//###################################################################################################################################################
//###################################################################################################################################################
// WARNING! THIS OBJECT IS AN INITIAL TEST VERSION NOT UP TO CURRENT STANDARDS, SEE WORKORDERBIZ FOR HOW THIS SHOULD BE CODED
//###################################################################################################################################################
//###################################################################################################################################################
////////////////////////////////////////////////////////////////////////////////////////////////
//UPDATE
//

View File

@@ -32,6 +32,14 @@ namespace AyaNova.Biz
return await ct.PMTemplate.AnyAsync(z => z.Id == id);
}
//###################################################################################################################################################
//###################################################################################################################################################
// WARNING! THIS OBJECT IS AN INITIAL TEST VERSION NOT UP TO CURRENT STANDARDS, SEE WORKORDERBIZ FOR HOW THIS SHOULD BE CODED
//###################################################################################################################################################
//###################################################################################################################################################
////////////////////////////////////////////////////////////////////////////////////////////////
//CREATE
//
@@ -98,6 +106,13 @@ namespace AyaNova.Biz
return ret;
}
//###################################################################################################################################################
//###################################################################################################################################################
// WARNING! THIS OBJECT IS AN INITIAL TEST VERSION NOT UP TO CURRENT STANDARDS, SEE WORKORDERBIZ FOR HOW THIS SHOULD BE CODED
//###################################################################################################################################################
//###################################################################################################################################################
////////////////////////////////////////////////////////////////////////////////////////////////
//UPDATE
//

View File

@@ -40,6 +40,13 @@ namespace AyaNova.Biz
return await ct.Quote.AnyAsync(z => z.Id == id);
}
//###################################################################################################################################################
//###################################################################################################################################################
// WARNING! THIS OBJECT IS AN INITIAL TEST VERSION NOT UP TO CURRENT STANDARDS, SEE WORKORDERBIZ FOR HOW THIS SHOULD BE CODED
//###################################################################################################################################################
//###################################################################################################################################################
////////////////////////////////////////////////////////////////////////////////////////////////
/// GET
///
@@ -58,6 +65,13 @@ namespace AyaNova.Biz
}
//###################################################################################################################################################
//###################################################################################################################################################
// WARNING! THIS OBJECT IS AN INITIAL TEST VERSION NOT UP TO CURRENT STANDARDS, SEE WORKORDERBIZ FOR HOW THIS SHOULD BE CODED
//###################################################################################################################################################
//###################################################################################################################################################
////////////////////////////////////////////////////////////////////////////////////////////////
//CREATE
@@ -139,6 +153,13 @@ namespace AyaNova.Biz
}
//###################################################################################################################################################
//###################################################################################################################################################
// WARNING! THIS OBJECT IS AN INITIAL TEST VERSION NOT UP TO CURRENT STANDARDS, SEE WORKORDERBIZ FOR HOW THIS SHOULD BE CODED
//###################################################################################################################################################
//###################################################################################################################################################
////////////////////////////////////////////////////////////////////////////////////////////////
//UPDATE
//

View File

@@ -38,6 +38,13 @@ namespace AyaNova.Biz
return await ct.QuoteTemplate.AnyAsync(z => z.Id == id);
}
//###################################################################################################################################################
//###################################################################################################################################################
// WARNING! THIS OBJECT IS AN INITIAL TEST VERSION NOT UP TO CURRENT STANDARDS, SEE WORKORDERBIZ FOR HOW THIS SHOULD BE CODED
//###################################################################################################################################################
//###################################################################################################################################################
////////////////////////////////////////////////////////////////////////////////////////////////
/// GET
///
@@ -124,6 +131,13 @@ namespace AyaNova.Biz
}
//###################################################################################################################################################
//###################################################################################################################################################
// WARNING! THIS OBJECT IS AN INITIAL TEST VERSION NOT UP TO CURRENT STANDARDS, SEE WORKORDERBIZ FOR HOW THIS SHOULD BE CODED
//###################################################################################################################################################
//###################################################################################################################################################
////////////////////////////////////////////////////////////////////////////////////////////////
//UPDATE
//
@@ -159,6 +173,13 @@ namespace AyaNova.Biz
return true;
}
//###################################################################################################################################################
//###################################################################################################################################################
// WARNING! THIS OBJECT IS AN INITIAL TEST VERSION NOT UP TO CURRENT STANDARDS, SEE WORKORDERBIZ FOR HOW THIS SHOULD BE CODED
//###################################################################################################################################################
//###################################################################################################################################################
private async Task SearchIndexAsync(QuoteTemplate obj, bool isNew)
{
//SEARCH INDEXING

View File

@@ -34,7 +34,7 @@ namespace AyaNova.Biz
{
using (AyContext ct = ServiceProviderProvider.DBContext)
{
// var ret = await ct.Database.ExecuteSqlRawAsync($"SELECT COUNT(*) FROM auser AS a WHERE (a.active = TRUE) AND ((a.usertype = 2) OR (a.usertype = 7))");
// var ret = await ct.Database.ExecuteSqlRawAsync($"SELECT COUNT(*) FROM auser AS a WHERE (a.active = TRUE) AND ((a.usertype = 2) OR (a.usertype = 7))");
var ret = await ct.User.AsNoTracking().Where(z => z.Active == true && (
z.UserType == UserType.Service ||
@@ -114,66 +114,54 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//CREATE
internal async Task<dtUser> CreateAsync(User inObj)
internal async Task<dtUser> CreateAsync(User newObject)
{
//password and login are optional but in the sense that they can be left out in a PUT
// but if left out here we need to generate a random value instead so they can't login but the code is happy
//because a login name and password are required always
if (string.IsNullOrWhiteSpace(inObj.Password))
if (string.IsNullOrWhiteSpace(newObject.Password))
{
inObj.Password = Hasher.GenerateSalt();//set it to some big random value
newObject.Password = Hasher.GenerateSalt();//set it to some big random value
}
if (string.IsNullOrWhiteSpace(inObj.Login))
if (string.IsNullOrWhiteSpace(newObject.Login))
{
inObj.Login = Hasher.GenerateSalt();//set it to some big random value
newObject.Login = Hasher.GenerateSalt();//set it to some big random value
}
//This is a new user so it will have been posted with a password in plaintext which needs to be salted and hashed
inObj.Salt = Hasher.GenerateSalt();
inObj.Password = Hasher.hash(inObj.Salt, inObj.Password);
newObject.Salt = Hasher.GenerateSalt();
newObject.Password = Hasher.hash(newObject.Salt, newObject.Password);
inObj.Tags = TagBiz.NormalizeTags(inObj.Tags);
inObj.CustomFields = JsonUtil.CompactJson(inObj.CustomFields);
newObject.Tags = TagBiz.NormalizeTags(newObject.Tags);
newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields);
//Seeder sets user options in advance so no need to create them here in that case
if (inObj.UserOptions == null)
if (newObject.UserOptions == null)
{
inObj.UserOptions = new UserOptions();
newObject.UserOptions = new UserOptions();
//todo: for now defaulting to server boot config but might need to add this to the route as an option
//now that it's not in the actual user record itself anymore as it's kind of critical
//revisit when get to client ui
inObj.UserOptions.TranslationId = ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID;
newObject.UserOptions.TranslationId = ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID;
}
await ValidateAsync(inObj, null);
await ValidateAsync(newObject, null);
if (HasErrors)
return null;
else
{
await ct.User.AddAsync(inObj);
//save to get Id
await ct.User.AddAsync(newObject);
await ct.SaveChangesAsync();
//Handle child and associated items
//Log event
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, inObj.Id, BizType, AyaEvent.Created), ct);
//SEARCH INDEXING
await SearchIndexAsync(inObj, true);
//TAGS
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, inObj.Tags, null);
await NotifyEventProcessor.HandlePotentialNotificationEvent(AyaEvent.Created, inObj);
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct);
await SearchIndexAsync(newObject, true);
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null);
await NotifyEventProcessor.HandlePotentialNotificationEvent(AyaEvent.Created, newObject);
dtUser retUser = new dtUser();
CopyObject.Copy(inObj, retUser);
CopyObject.Copy(newObject, retUser);
return retUser;
}
}
@@ -348,23 +336,26 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//DELETE
//
internal async Task<bool> DeleteAsync(User dbObject)
internal async Task<bool> DeleteAsync(long id)
{
await ValidateCanDelete(dbObject);
if (HasErrors)
return false;
using (var transaction = await ct.Database.BeginTransactionAsync())
{
try
{
User dbObject = await ct.User.SingleOrDefaultAsync(z => z.Id == id);
await ValidateCanDelete(dbObject);
if (HasErrors)
return false;
//Remove the object
ct.User.Remove(dbObject);
await ct.SaveChangesAsync();
//Delete sibling objects
//USEROPTIONS
await ct.Database.ExecuteSqlInterpolatedAsync($"delete from auseroptions where userid = {dbObject.Id}");
//NOTIFY SUBSCRIPTIONS
await ct.Database.ExecuteSqlInterpolatedAsync($"delete from anotifysubscription where userid = {dbObject.Id}");
//personal datalistview
await ct.Database.ExecuteSqlInterpolatedAsync($"delete from adatalistview where public = {false} and userid = {dbObject.Id}");
@@ -574,7 +565,7 @@ namespace AyaNova.Biz
//if (await ct.Event.Select(z => z).Where(z => z.UserId == inObj.Id).Count() > 0)
if (await ct.Event.AnyAsync(z => z.UserId == inObj.Id))
{
AddError(ApiErrorCode.INVALID_OPERATION, "user", "LT:ErrorDBForeignKeyViolation");
AddError(ApiErrorCode.INVALID_OPERATION, null, "LT:ErrorDBForeignKeyViolation");
return;
}

View File

@@ -56,6 +56,13 @@ namespace AyaNova.Biz
}
//###################################################################################################################################################
//###################################################################################################################################################
// WARNING! THIS OBJECT IS AN INITIAL TEST VERSION NOT UP TO CURRENT STANDARDS, SEE WORKORDERBIZ FOR HOW THIS SHOULD BE CODED
//###################################################################################################################################################
//###################################################################################################################################################
////////////////////////////////////////////////////////////////////////////////////////////////
//CREATE
@@ -126,6 +133,13 @@ namespace AyaNova.Biz
}
//###################################################################################################################################################
//###################################################################################################################################################
// WARNING! THIS OBJECT IS AN INITIAL TEST VERSION NOT UP TO CURRENT STANDARDS, SEE WORKORDERBIZ FOR HOW THIS SHOULD BE CODED
//###################################################################################################################################################
//###################################################################################################################################################
////////////////////////////////////////////////////////////////////////////////////////////////
//UPDATE
//
@@ -181,6 +195,13 @@ namespace AyaNova.Biz
return SearchParams;
}
//###################################################################################################################################################
//###################################################################################################################################################
// WARNING! THIS OBJECT IS AN INITIAL TEST VERSION NOT UP TO CURRENT STANDARDS, SEE WORKORDERBIZ FOR HOW THIS SHOULD BE CODED
//###################################################################################################################################################
//###################################################################################################################################################
////////////////////////////////////////////////////////////////////////////////////////////////
//DELETE
//