diff --git a/.vscode/launch.json b/.vscode/launch.json index db4b77d..8038f80 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -35,7 +35,7 @@ "SOCKEYE_DB_CONNECTION": "Server=localhost;Username=postgres;Password=sockeye;Database=sockeye;CommandTimeout=300;", "SOCKEYE_DATA_PATH": "c:\\temp\\sockeye", "SOCKEYE_USE_URLS": "http://*:7676;", - //"SOCKEYE_PERMANENTLY_ERASE_DATABASE":"true", + "SOCKEYE_PERMANENTLY_ERASE_DATABASE":"true", //"SOCKEYE_REPORT_RENDERING_TIMEOUT":"1", "SOCKEYE_BACKUP_PG_DUMP_PATH": "C:\\data\\code\\postgres_14\\bin" }, diff --git a/server/biz/GlobalBizSettingsBiz.cs b/server/biz/GlobalBizSettingsBiz.cs index 2490db8..208aab6 100644 --- a/server/biz/GlobalBizSettingsBiz.cs +++ b/server/biz/GlobalBizSettingsBiz.cs @@ -351,106 +351,106 @@ namespace Sockeye.Biz #region CASES - log.LogInformation("RFImport Cases"); - //case projects to be tags - List CaseProjectList = new List(); - { - res = await client.GetAsync($"{URL_ROCKFISH}api/rfcaseproject"); - responseText = await res.Content.ReadAsStringAsync(); + // log.LogInformation("RFImport Cases"); + // //case projects to be tags + // List CaseProjectList = new List(); + // { + // res = await client.GetAsync($"{URL_ROCKFISH}api/rfcaseproject"); + // responseText = await res.Content.ReadAsStringAsync(); - var jaRFCaseProjectList = JArray.Parse(responseText); - foreach (JObject jRFCaseProject in jaRFCaseProjectList) - { - CaseProjectList.Add(new NameIdItem() { Name = jRFCaseProject["name"].Value(), Id = jRFCaseProject["id"].Value() }); + // var jaRFCaseProjectList = JArray.Parse(responseText); + // foreach (JObject jRFCaseProject in jaRFCaseProjectList) + // { + // CaseProjectList.Add(new NameIdItem() { Name = jRFCaseProject["name"].Value(), Id = jRFCaseProject["id"].Value() }); - } + // } - } - { - res = await client.GetAsync($"{URL_ROCKFISH}api/rfcase/list"); - responseText = await res.Content.ReadAsStringAsync(); - var jaRFCaseList = JArray.Parse(responseText); - //some cases are missing the start date so substitute a close other case date (not critical but sb at least in the ballpark for list viewing purposes) - DateTime dtTempCreated = new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc); - foreach (JObject jRFCase in jaRFCaseList.Reverse()) - { + // } + // { + // res = await client.GetAsync($"{URL_ROCKFISH}api/rfcase/list"); + // responseText = await res.Content.ReadAsStringAsync(); + // var jaRFCaseList = JArray.Parse(responseText); + // //some cases are missing the start date so substitute a close other case date (not critical but sb at least in the ballpark for list viewing purposes) + // DateTime dtTempCreated = new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc); + // foreach (JObject jRFCase in jaRFCaseList.Reverse()) + // { - var g = new GZCase(); - g.CaseId = jRFCase["id"].Value(); - g.Closed = DateUtil.EpochToDateNullIsNull(jRFCase["dtClosed"].Value()); - //NOTE: closed in rockfish was the date at midnight in GMT - //so to be in the same day as here need to add a few hours, let's say 8 am for each so add 8 hours - if (g.Closed != null) - { - g.Closed = ((DateTime)g.Closed).AddHours(16); - } + // var g = new GZCase(); + // g.CaseId = jRFCase["id"].Value(); + // g.Closed = DateUtil.EpochToDateNullIsNull(jRFCase["dtClosed"].Value()); + // //NOTE: closed in rockfish was the date at midnight in GMT + // //so to be in the same day as here need to add a few hours, let's say 8 am for each so add 8 hours + // if (g.Closed != null) + // { + // g.Closed = ((DateTime)g.Closed).AddHours(16); + // } - //fuckery to try to insert a at least semi close date when created date is missing - DateTime? dtTemp = DateUtil.EpochToDateNullIsNull(jRFCase["dtCreated"].Value()); - if (dtTemp == null) - { - dtTemp = dtTempCreated; - } - else - { - dtTempCreated = (DateTime)dtTemp; - } - g.Created = (DateTime)dtTemp; - g.Name = jRFCase["title"].Value(); - g.Notes = jRFCase["notes"].Value(); + // //fuckery to try to insert a at least semi close date when created date is missing + // DateTime? dtTemp = DateUtil.EpochToDateNullIsNull(jRFCase["dtCreated"].Value()); + // if (dtTemp == null) + // { + // dtTemp = dtTempCreated; + // } + // else + // { + // dtTempCreated = (DateTime)dtTemp; + // } + // g.Created = (DateTime)dtTemp; + // g.Name = jRFCase["title"].Value(); + // g.Notes = jRFCase["notes"].Value(); - var ver = jRFCase["releaseVersion"].Value(); - if (!string.IsNullOrWhiteSpace(ver)) - g.Notes += $"\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\nReleased on version:{ver}"; + // var ver = jRFCase["releaseVersion"].Value(); + // if (!string.IsNullOrWhiteSpace(ver)) + // g.Notes += $"\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\nReleased on version:{ver}"; - var releaseNotes = jRFCase["releaseNotes"].Value(); - if (!string.IsNullOrWhiteSpace(releaseNotes)) - g.Notes += $"\nRelease notes:{releaseNotes}"; + // var releaseNotes = jRFCase["releaseNotes"].Value(); + // if (!string.IsNullOrWhiteSpace(releaseNotes)) + // g.Notes += $"\nRelease notes:{releaseNotes}"; - //Project name to tags - g.Tags.Add(CaseProjectList.FirstOrDefault(z => z.Id == jRFCase["rfCaseProjectId"].Value()).Name.Replace("z_", "legacy-")); + // //Project name to tags + // g.Tags.Add(CaseProjectList.FirstOrDefault(z => z.Id == jRFCase["rfCaseProjectId"].Value()).Name.Replace("z_", "legacy-")); - //priority to tags - g.Tags.Add($"{jRFCase["priority"].Value()}-priority"); + // //priority to tags + // g.Tags.Add($"{jRFCase["priority"].Value()}-priority"); - //check for attachments and just add as a note, don't bother with actual transfer of attachment, there aren't a lot and most are way in the past and not required for anything - //if needed in future can manually xfer it over from the rockfish.sqlite db directly using DB BRowser for sqlite which allows opening the blob from the rfcaseblob table and saving it - res = await client.GetAsync($"{URL_ROCKFISH}api/rfcase/{g.CaseId}/attachments"); - responseText = await res.Content.ReadAsStringAsync(); - var jAttachments = JObject.Parse(responseText); - if (jAttachments["attach"].Count() > 0) - { - g.Notes += "\n********\nRockfish attachments\n"; - foreach (JObject jAttachmentRecord in jAttachments["attach"]) - { - g.Notes += $"File: \"{jAttachmentRecord["name"].Value()}\", rfcaseblob table id: {jAttachmentRecord["id"].Value()}\n"; + // //check for attachments and just add as a note, don't bother with actual transfer of attachment, there aren't a lot and most are way in the past and not required for anything + // //if needed in future can manually xfer it over from the rockfish.sqlite db directly using DB BRowser for sqlite which allows opening the blob from the rfcaseblob table and saving it + // res = await client.GetAsync($"{URL_ROCKFISH}api/rfcase/{g.CaseId}/attachments"); + // responseText = await res.Content.ReadAsStringAsync(); + // var jAttachments = JObject.Parse(responseText); + // if (jAttachments["attach"].Count() > 0) + // { + // g.Notes += "\n********\nRockfish attachments\n"; + // foreach (JObject jAttachmentRecord in jAttachments["attach"]) + // { + // g.Notes += $"File: \"{jAttachmentRecord["name"].Value()}\", rfcaseblob table id: {jAttachmentRecord["id"].Value()}\n"; - } - g.Notes += "\n********\n"; - } + // } + // g.Notes += "\n********\n"; + // } - GZCaseBiz biz = GZCaseBiz.GetBiz(ct); - await biz.CreateAsync(g); + // GZCaseBiz biz = GZCaseBiz.GetBiz(ct); + // await biz.CreateAsync(g); - //attachments example 86400000 - // /api/rfcase/4360/attachments - //{"dlkey":"ZFkAUpo1L0Gi3Q9aO5szkA","attach":[{"id":259,"name":"desired weight calcs.txt"}]} - //{"dlkey":"iR6ncD70CkzkozyT0otA","attach":[]} + // //attachments example 86400000 + // // /api/rfcase/4360/attachments + // //{"dlkey":"ZFkAUpo1L0Gi3Q9aO5szkA","attach":[{"id":259,"name":"desired weight calcs.txt"}]} + // //{"dlkey":"iR6ncD70CkzkozyT0otA","attach":[]} - }// all cases loop + // }// all cases loop - //Start next case with a new sequence caseid of 4444 - using (var command = ct.Database.GetDbConnection().CreateCommand()) - { - command.CommandText = $"ALTER SEQUENCE agzcase_caseid_seq RESTART WITH 4444;"; - await ct.Database.OpenConnectionAsync(); - await command.ExecuteNonQueryAsync(); - await ct.Database.CloseConnectionAsync(); - } - } + // //Start next case with a new sequence caseid of 4444 + // using (var command = ct.Database.GetDbConnection().CreateCommand()) + // { + // command.CommandText = $"ALTER SEQUENCE agzcase_caseid_seq RESTART WITH 4444;"; + // await ct.Database.OpenConnectionAsync(); + // await command.ExecuteNonQueryAsync(); + // await ct.Database.CloseConnectionAsync(); + // } + // } #endregion cases @@ -620,7 +620,7 @@ namespace Sockeye.Biz l.Active = true;//active here means it's been fully prepared and is viable for use, all prior licenses fit this description so all are active l.NotificationSent = true; LicenseBiz biz = LicenseBiz.GetBiz(ct); - await biz.CreateAsync(l); + await biz.CreateAsync(l, true); }// all licenses loop @@ -659,23 +659,54 @@ namespace Sockeye.Biz "dtFetched": 1672257635 }, */ - var l = new TrialLicenseRequest(); - l.DbId = jTrialRequestItem["dbId"].Value(); - l.Perpetual = jTrialRequestItem["perpetual"].Value(); - l.CompanyName = jTrialRequestItem["companyName"].Value(); - l.ContactName = jTrialRequestItem["contactName"].Value(); - l.Email = jTrialRequestItem["email"].Value(); - l.EmailConfirmCode = jTrialRequestItem["emailConfirmCode"].Value(); - l.EmailValidated = jTrialRequestItem["emailValidated"].Value(); - l.Requested = (DateTime)DateUtil.EpochToDateNullIsNull(jTrialRequestItem["dtRequested"].Value()); - l.Processed = DateUtil.EpochToDateNullIsNull(jTrialRequestItem["dtProcessed"].Value()); - l.FetchedOn = DateUtil.EpochToDateNullIsNull(jTrialRequestItem["dtFetched"].Value()); - l.Status = (TrialRequestStatus)jTrialRequestItem["status"].Value(); - l.RejectReason = jTrialRequestItem["rejectReason"].Value(); - l.Key = jTrialRequestItem["key"].Value(); - var biz = TrialLicenseRequestBiz.GetBiz(ct); - await biz.CreateAsync(l); + + //Save Key first then can set keyid on tlr + { + License l = new License(); + l.TrialMode = true; + l.Key = jTrialRequestItem["key"].Value(); + + //Parse key as we need the expiry dates and they are only stored in the key not the trial request + string keyNoWS = System.Text.RegularExpressions.Regex.Replace(StringUtil.Extract(l.Key, "[KEY", "KEY]").Trim(), "(\"(?:[^\"\\\\]|\\\\.)*\")|\\s+", "$1"); + var jKey = JObject.Parse(keyNoWS); + l.DbId = jKey["Key"]["DBID"].Value(); + l.LicenseExpire = jKey["Key"]["LicenseExpiration"].Value().ToUniversalTime(); + if ((bool?)jKey["Key"]["Perpetual"] ?? true) + l.PGroup = ProductGroup.RavenPerpetual; + else + l.PGroup = ProductGroup.RavenSubscription; + l.MaintenanceExpire = jKey["Key"]["MaintenanceExpiration"].Value().ToUniversalTime(); + l.Tags.Add("raven"); + l.Tags.Add("trial"); + l.Created = DateUtil.EpochToDateNullIsMin(jTrialRequestItem["dtProcessed"].Value()); + l.FetchedOn = DateUtil.EpochToDateNullIsNull(jTrialRequestItem["dtFetched"].Value()); + l.FetchEmail = jTrialRequestItem["email"].Value(); + + l.Active = true;//active here means it's been fully prepared and is viable for use, all prior licenses fit this description so all are active + l.NotificationSent = true; + LicenseBiz lbiz = LicenseBiz.GetBiz(ct); + await lbiz.CreateAsync(l, true); + } + + { + var tlr = new TrialLicenseRequest(); + tlr.DbId = jTrialRequestItem["dbId"].Value(); + tlr.PGroup = (jTrialRequestItem["perpetual"].Value() ? ProductGroup.RavenPerpetual : ProductGroup.RavenSubscription); + tlr.CompanyName = jTrialRequestItem["companyName"].Value(); + tlr.ContactName = jTrialRequestItem["contactName"].Value(); + tlr.Email = jTrialRequestItem["email"].Value(); + tlr.EmailConfirmCode = jTrialRequestItem["emailConfirmCode"].Value(); + tlr.EmailValidated = jTrialRequestItem["emailValidated"].Value(); + tlr.Requested = (DateTime)DateUtil.EpochToDateNullIsNull(jTrialRequestItem["dtRequested"].Value()); + tlr.Processed = DateUtil.EpochToDateNullIsNull(jTrialRequestItem["dtProcessed"].Value()); + tlr.Status = (TrialRequestStatus)jTrialRequestItem["status"].Value(); + tlr.RejectReason = jTrialRequestItem["rejectReason"].Value(); + + var biz = TrialLicenseRequestBiz.GetBiz(ct); + await biz.CreateAsync(tlr); + } + }// all trial requests loop diff --git a/server/biz/LicenseBiz.cs b/server/biz/LicenseBiz.cs index 3852486..bb172c3 100644 --- a/server/biz/LicenseBiz.cs +++ b/server/biz/LicenseBiz.cs @@ -41,14 +41,15 @@ namespace Sockeye.Biz //////////////////////////////////////////////////////////////////////////////////////////////// //CREATE // - internal async Task CreateAsync(License newObject) + internal async Task CreateAsync(License newObject, bool importedWithKeyDoNotGenerate = false) { await ValidateAsync(newObject, null); if (HasErrors) return null; else { - await GenerateKey(newObject); + if (!importedWithKeyDoNotGenerate)//do not generate is used for initial import only from rockfish, could be removed after the initial import + await GenerateKey(newObject); if (HasErrors) return null; newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); await ct.License.AddAsync(newObject);