diff --git a/.vscode/launch.json b/.vscode/launch.json index 8fd97968..0e2049e9 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -53,7 +53,7 @@ "AYANOVA_FOLDER_USER_FILES": "c:\\temp\\RavenTestData\\userfiles", "AYANOVA_FOLDER_BACKUP_FILES": "c:\\temp\\RavenTestData\\backupfiles", "AYANOVA_FOLDER_TEMPORARY_SERVER_FILES": "c:\\temp\\RavenTestData\\tempfiles", - "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\\postgres_13\\bin\\" diff --git a/server/AyaNova/biz/UserBiz.cs b/server/AyaNova/biz/UserBiz.cs index 821ef524..f3eb6fd8 100644 --- a/server/AyaNova/biz/UserBiz.cs +++ b/server/AyaNova/biz/UserBiz.cs @@ -14,7 +14,7 @@ namespace AyaNova.Biz { - internal class UserBiz : BizObject, IJobObject, ISearchAbleObject + internal class UserBiz : BizObject, IJobObject, ISearchAbleObject, IReportAbleObject { public bool SeedOrImportRelaxedRulesMode { get; set; } @@ -356,7 +356,7 @@ namespace AyaNova.Biz var TransDict = await TranslationBiz.GetSubsetStaticAsync(TransKeysRequired, EffectiveTranslationId); var Title = TransDict["PasswordResetMessageTitle"]; var MessageBody = TransDict["PasswordResetMessageBody"]; - var loginName=Uri.EscapeDataString(dbObject.Login); + var loginName = Uri.EscapeDataString(dbObject.Login); //Hello {user_name},\n\nYour online account for service is available to you after you set your password.\nYou can use the following link for the next 48 hours to set your password.\n\nSet your password: {action_link}\n\nIf you did not request an account or password reset, please ignore this email.\n\nThanks,\n{registered_to}" MessageBody = MessageBody.Replace("{user_name}", dbObject.Name).Replace("{action_link}", $"{ServerUrl}/home-reset?rc={ResetCode}&tr={EffectiveTranslationId}&lg={loginName}").Replace("{registered_to}", AyaNova.Core.License.ActiveKey.RegisteredTo); @@ -366,7 +366,7 @@ namespace AyaNova.Biz //Log modification and save context await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified, "SendPasswordResetCode"), ct); - return dbObject.Concurrency; + return dbObject.Concurrency; } @@ -653,7 +653,35 @@ namespace AyaNova.Biz return DownloadUser; } + //////////////////////////////////////////////////////////////////////////////////////////////// + //REPORTING + // + public async Task GetReportData(long[] idList) + { + JArray ReportData = new JArray(); + while (idList.Any()) + { + var batch = idList.Take(IReportAbleObject.REPORT_DATA_BATCH_SIZE); + idList = idList.Skip(IReportAbleObject.REPORT_DATA_BATCH_SIZE).ToArray(); + //query for this batch, comes back in db natural order unfortunately + var batchResults = await ct.User.Include(z => z.UserOptions).Where(z => batch.Contains(z.Id)).ToArrayAsync(); + //order the results back into original + var orderedList = from id in batch join z in batchResults on id equals z.Id select z; + //foreach (User w in orderedList) + foreach (var w in orderedList) + { + var jo = JObject.FromObject(w); + if (!JsonUtil.JTokenIsNullOrEmpty(jo["CustomFields"])) + jo["CustomFields"] = JObject.Parse((string)jo["CustomFields"]); + jo.Remove("Login"); + jo.Remove("Password"); + jo["UserOptions"] = JObject.FromObject(w.UserOptions); + ReportData.Add(jo); + } + } + return ReportData; + } //////////////////////////////////////////////////////////////////////////////////////////////// @@ -733,6 +761,7 @@ namespace AyaNova.Biz + ///////////////////////////////////////////////////////////////////// }//eoc diff --git a/server/AyaNova/models/User.cs b/server/AyaNova/models/User.cs index 7352da28..232677da 100644 --- a/server/AyaNova/models/User.cs +++ b/server/AyaNova/models/User.cs @@ -34,6 +34,9 @@ namespace AyaNova.Models [NotMapped, JsonIgnore] public AyaType AyaType { get => AyaType.User; } + + // [JsonIgnore]//hide from being returned (as null anyway) with User object in routes + // public UserOptions UserOptions { get; set; } }//eoc public class User : ICoreBizObjectModel