From b70fa35ef6795fbdf425143501e45d82919841ae Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Thu, 2 Feb 2023 15:21:48 +0500 Subject: [PATCH 01/17] bug fixing in UserRepositoty.UpdateAsync --- .../Repository/UserRepository.cs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index efc0db16..9a666b68 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -101,13 +101,14 @@ namespace AsbCloudInfrastructure.Repository var userRoles = await userRoleRepository.GetByNamesAsync(dto.RoleNames, token).ConfigureAwait(false); await UpdateRolesCacheForUserAsync(dto.Id, userRoles, token); - - var entity = Convert(dto); - - var result = dbContext.Users.Upsert(entity); - await dbContext.SaveChangesAsync(token); + var userInDb = dbContext.Users.FirstOrDefault(u => u.Id == dto.Id); + if (userInDb is not null) + { + userInDb = Convert(dto); + await dbContext.SaveChangesAsync(token); + } DropCacheUsers(); - return result.Entity.Id; + return userInDb!.Id; } public async Task DeleteAsync(int id, CancellationToken token) @@ -213,7 +214,7 @@ namespace AsbCloudInfrastructure.Repository protected virtual User Convert(UserExtendedDto dto) { - var entity = dto.Adapt(userTypeAdapterConfig); + var entity = dto.Adapt(userTypeAdapterConfig); if (string.IsNullOrEmpty(entity.PasswordHash)) entity.PasswordHash = dbContext.Users.FirstOrDefault(u => u.Id == dto.Id)?.PasswordHash; return entity; From ff12c1749656e3ccae8e74f0a32e308abd76eae1 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Sun, 5 Feb 2023 21:53:51 +0500 Subject: [PATCH 02/17] =?UTF-8?q?=D0=BA=D1=8D=D1=88=20=D1=81=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=20=D0=BD=D0=B0=20memoryCache=20(=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D1=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AsbCloudInfrastructure.csproj | 1 + .../Repository/UserRepository.cs | 127 ++++++++++++++---- 2 files changed, 104 insertions(+), 24 deletions(-) diff --git a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj index 1a8e2432..84cf9062 100644 --- a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj +++ b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj @@ -43,6 +43,7 @@ + diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index 9a666b68..0b5a3a58 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -1,9 +1,7 @@ using AsbCloudApp.Data; using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; -using AsbCloudDb; using AsbCloudDb.Model; -using AsbCloudInfrastructure.EfCache; using Mapster; using Microsoft.EntityFrameworkCore; using System; @@ -11,6 +9,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using Microsoft.Extensions.Caching.Memory; namespace AsbCloudInfrastructure.Repository { @@ -29,10 +28,12 @@ namespace AsbCloudInfrastructure.Repository dst => dst.Files, dst => dst.RelationUsersUserRoles) .Config; - - public UserRepository(IAsbCloudDbContext dbContext, IUserRoleRepository userRoleRepository) { + private readonly IMemoryCache memoryCache; + public UserRepository(IAsbCloudDbContext dbContext, IUserRoleRepository userRoleRepository, IMemoryCache memoryCache) + { this.dbContext = dbContext; this.userRoleRepository = userRoleRepository; + this.memoryCache = memoryCache; } public async Task InsertAsync(UserExtendedDto dto, CancellationToken token) @@ -58,12 +59,13 @@ namespace AsbCloudInfrastructure.Repository public async Task> GetAllAsync(CancellationToken token) { - var dtos = (await GetCacheUserAsync(token)).ToList(); + var dtos = (await GetCacheUserAsync(token)).ToList(); + var listDtos = dtos.ToList(); if (dtos is null) return Enumerable.Empty(); - for (var i = 0; i < dtos.Count; i++) - dtos[i].RoleNames = GetRolesNamesByIdUser(dtos[i].Id); + for (var i = 0; i < listDtos.Count; i++) + listDtos[i].RoleNames = GetRolesNamesByIdUser(listDtos[i].Id); return dtos; } @@ -170,31 +172,43 @@ namespace AsbCloudInfrastructure.Repository throw new ArgumentInvalidException($"Login {login} is busy by {existingUserDto.MakeDisplayName()}, id{existingUserDto.Id}", nameof(login)); } - private Task> GetCacheUserAsync(CancellationToken token) - => dbContext.Users + private async Task> GetCacheUserAsync(CancellationToken token) + { + var query = dbContext.Users .Include(r => r.Company) - .Include(r => r.RelationUsersUserRoles) - .FromCacheAsync(userCacheTag, cacheObsolence, Convert, token); + .Include(r => r.RelationUsersUserRoles); + return await FromCacheAsync(query, userCacheTag, cacheObsolence, Convert, token); + } private IEnumerable GetCacheUser() - => dbContext.Users + { + var query = dbContext.Users .Include(r => r.Company) - .Include(r => r.RelationUsersUserRoles) - .FromCache(userCacheTag, cacheObsolence, Convert); + .Include(r => r.RelationUsersUserRoles); + return FromCache(query, userCacheTag, cacheObsolence, Convert); + } private void DropCacheUsers() - => dbContext.Users.DropCache(userCacheTag); + { + memoryCache.Remove(userCacheTag); + } - private Task> GetCacheRelationUserUserRoleAsync(CancellationToken token) - => dbContext.RelationUserUserRoles + private async Task> GetCacheRelationUserUserRoleAsync(CancellationToken token) + { + var query = dbContext.RelationUserUserRoles .Include(r => r.UserRole) - .Include(r => r.User) - .FromCacheAsync(relationUserUserRoleCacheTag, cacheObsolence, token); + .Include(r => r.User); + return await FromCacheAsync(query, relationUserUserRoleCacheTag, cacheObsolence, token); + } private IEnumerable GetCachRelationUserUserRoleCacheTag() - => dbContext.RelationUserUserRoles - .Include(r => r.UserRole) - .Include(r => r.User) - .FromCache(relationUserUserRoleCacheTag, cacheObsolence); + { + var query = dbContext.RelationUserUserRoles + .Include(r => r.UserRole) + .Include(r => r.User); + return FromCache(query, relationUserUserRoleCacheTag, cacheObsolence); + } private void DropCacheRelationUserUserRoleCacheTag() - => dbContext.RelationUserUserRoles.DropCache(relationUserUserRoleCacheTag); + { + memoryCache.Remove(relationUserUserRoleCacheTag); + } private async Task UpdateRolesCacheForUserAsync(int idUser, IEnumerable newRoles, CancellationToken token) { @@ -212,6 +226,71 @@ namespace AsbCloudInfrastructure.Repository DropCacheRelationUserUserRoleCacheTag(); } + public async Task> FromCacheAsync(IQueryable query, string tag, TimeSpan obsolescence, Func convert, CancellationToken token) + where TEntity : class + { + async Task factory(CancellationToken token) + => await query.AsNoTracking().ToArrayAsync(token); + var cache = await GetOrAddCacheAsync(tag, factory, obsolescence, token); + return cache.Select(convert); + } + public async Task> FromCacheAsync(IQueryable query, string tag, TimeSpan obsolescence, CancellationToken token) + where TEntity : class + { + async Task factory(CancellationToken token) + => await query.AsNoTracking().ToArrayAsync(token); + var cache = await GetOrAddCacheAsync(tag, factory, obsolescence, token); + return cache; + } + public IEnumerable FromCache(IQueryable query, string tag, TimeSpan obsolescence, Func convert) + where TEntity : class + { + TEntity[] factory() + => query.AsNoTracking().ToArray(); + var cache = GetOrAddCache(tag, factory, obsolescence); + return cache.Select(convert); + } + public IEnumerable FromCache(IQueryable query, string tag, TimeSpan obsolescence) + where TEntity : class + { + TEntity[] factory() + => query.AsNoTracking().ToArray(); + var cache = GetOrAddCache(tag, factory, obsolescence); + return cache; + } + private async Task GetOrAddCacheAsync(string tag, Func> valueFactoryAsync, TimeSpan obsolete, CancellationToken token) + + { + memoryCache.TryGetValue(tag, out TEntity[]? cached); + if (cached == null) + { + var values = await valueFactoryAsync(token); + + if (values != null) + { + memoryCache.Set(tag, values, new MemoryCacheEntryOptions().SetAbsoluteExpiration(obsolete)); + } + return values!; + } + return cached; + } + private TEntity[] GetOrAddCache(string tag, Func valueFactory, TimeSpan obsolete) + + { + memoryCache.TryGetValue(tag, out TEntity[]? cached); + if (cached == null) + { + var values = valueFactory(); + + if (values != null) + { + memoryCache.Set(tag, values, new MemoryCacheEntryOptions().SetAbsoluteExpiration(obsolete)); + } + return values!; + } + return cached; + } + protected virtual User Convert(UserExtendedDto dto) { var entity = dto.Adapt(userTypeAdapterConfig); From d70cf25c0a399f018a0730904c1d16e405bdcdb7 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 6 Feb 2023 13:13:23 +0500 Subject: [PATCH 03/17] =?UTF-8?q?=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D0=B4?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=D1=8B=D0=B3=D1=80=D1=83=D0=B6?= =?UTF-8?q?=D0=B0=D0=B5=D0=BC=D0=BE=D0=B3=D0=BE=20=D0=BE=D1=82=D1=87=D0=B5?= =?UTF-8?q?=D1=82=D0=B0=20=D0=A0=D0=A2=D0=9A=20=D0=BA=20=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D1=83=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=BC=D1=83=20=D1=81=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D1=8F=D0=BD=D0=B8=D1=8E=20(=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=B7=D0=B0=D0=B3=D0=BE?= =?UTF-8?q?=D0=BB=D0=BE=D0=B2=D0=BE=D0=BA,=20=D1=87=D0=B0=D1=81=D1=82?= =?UTF-8?q?=D0=B8=D1=87=D0=BD=D0=BE=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=88=D0=B0=D0=BF=D0=BA=D0=B0=20=D0=BE=D1=82?= =?UTF-8?q?=D1=87=D0=B5=D1=82=D0=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProcessMap/ProcessMapReportService.cs | 35 ++++++++++++------ .../ProcessMap/ProcessMapReportTemplate.xlsx | Bin 6007 -> 7570 bytes 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs index da7f3f79..2fe5b180 100644 --- a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs @@ -13,9 +13,9 @@ namespace AsbCloudInfrastructure.Services.ProcessMap public class ProcessMapReportService : IProcessMapReportService { const int firstColumn = 2; - const int lastColumn = 27; + const int lastColumn = 30; - const int headerRowsCount = 3; + const int headerRowsCount = 8; private readonly IProcessMapService processMapService; @@ -68,7 +68,9 @@ namespace AsbCloudInfrastructure.Services.ProcessMap sheet.Range(row, firstColumn, row, lastColumn) .Merge() .FirstCell() - .SetVal(sectionName); + .SetVal(sectionName) + .Style + .Fill.SetBackgroundColor(XLColor.LightGray); row++; @@ -82,14 +84,17 @@ namespace AsbCloudInfrastructure.Services.ProcessMap private static int FillIntervalData(IXLWorksheet sheet, ProcessMapReportDto interval, int row) { - const int columnDepth = firstColumn; - const int columnDate = firstColumn + 1; - const int columnRopTime = firstColumn + 2; - const int columnMode = firstColumn + 3; + const int columnDepth = firstColumn + 1; + const int columnDate = firstColumn + 2; + const int columnRopTime = firstColumn + 3; + const int columnMode = firstColumn + 4; int rowRotor = row; int rowSlide = row + 1; + sheet.Range(rowRotor, firstColumn, rowSlide, firstColumn) + .Merge(); + sheet.Range(rowRotor, columnDepth, rowSlide, columnDepth) .Merge().FirstCell() .SetVal(interval.DepthStart, "0.0"); @@ -115,8 +120,9 @@ namespace AsbCloudInfrastructure.Services.ProcessMap int columnLoad = columnPressure + 5; int columnTorque = columnLoad + 5; int columnSpeed = columnTorque + 5; - int columnUsage = columnSpeed + 4; - int columnRop = columnUsage + 1; + int columnUsagePlan = columnSpeed + 5; + int columnUsageFact = columnUsagePlan + 1; + int columnRop = columnUsageFact + 1; sheet.Cell(row, column) .SetVal(modeName); @@ -129,7 +135,10 @@ namespace AsbCloudInfrastructure.Services.ProcessMap FillIntervalModeDataParam(sheet, modeData.TopDriveTorque, columnTorque, row); FillIntervalModeDataSpeed(sheet, modeData.SpeedLimit, columnSpeed, row); - sheet.Cell(row, columnUsage) + sheet.Cell(row, columnUsagePlan) + .SetVal(100); + + sheet.Cell(row, columnUsageFact) .SetVal(modeData.Usage); sheet.Cell(row, columnRop) @@ -167,7 +176,8 @@ namespace AsbCloudInfrastructure.Services.ProcessMap const int columnOffsetSpPlan = 0; const int columnOffsetSpFact = 1; const int columnOffsetFact = 2; - const int columnOffsetPercent = 3; + const int columnOffsetLimit = 3; + const int columnOffsetPercent = 4; sheet.Cell(row, column + columnOffsetSpPlan) .SetVal(dataParam.SetpointPlan); @@ -178,6 +188,9 @@ namespace AsbCloudInfrastructure.Services.ProcessMap sheet.Cell(row, column + columnOffsetFact) .SetVal(dataParam.Fact); + sheet.Cell(row, column + columnOffsetLimit) + .SetVal(dataParam.Limit); + sheet.Cell(row, column + columnOffsetPercent) .SetVal(dataParam.PercDrillingSetpoint); } diff --git a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportTemplate.xlsx b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportTemplate.xlsx index 64b328cd82d6f571285c9a726b2ff39661bfb0a3..e716a80835311240d6ee20fc8812d0c03eb330eb 100644 GIT binary patch delta 5847 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 delta 4285 zcmZ8l2Q*w=*Pbz$(MK6=M2+5C7(MFfqKw`XCD9@zYDNj71|x`GBZ!dE>#KzzBzp7` z31Tp!2k}eZwf>d&yK9|w&)#?6v(DY^KF>*&KNg`d(ghLH0U!_vK-)^}EyZ;p=<1G< z0*aswX{N=6z)8x;u*VVC_0xgeNkTX1_>w;_%dNWHpcIS1@svYyfUJ3!V;;C^m%LED`lfCWmOEZ z&&phzN>^Kwai=7bRy2#~)p_Z6Q#d+kGus#qy2AsmiNY7NZ=4Z*O_hSET_`gO3Xy+>1^)db!Da{y==Sg_U@vEo6cq;_=kED0_4jD z%~oig4wbw2IRyy!80(>V#QodP&7p&<`W}%3a`*ckJ?*~xZ$L%UzS%#oGo3H7BB4gp zR#w`|T)!LmvwBcpctTiTFMEFe!N7zZPgBu$SKxNian1}2!)Ik?md0kX<)Qh$+t57C z-dd^VH&Jl|+F{jqY~Wj2vUG8n*MPH0YRWY>y|sr^N{X9=p+64~&QAOHKi0U!Z|X)5 z=b8zj%;)jy?Cy$d7N0VNd<%qWA`^7c4u@WLT6QSyvdzc52v>4D)xx{=vq{Ld!u=X* z?1rto$aW85sAij41es2_S)&Bh1b5#n@kKAw<^-EBjnBW6gr;*2+d&B(s{kIjVCRJg>%oQi^NeF6Ln$e=*P}jO zyV5|tj`l6Bi_HQy|6=Wc35uRm?c?)}lakg zaoE@JkCR?^>hdS-ry#W1=aQb~0TPNVL?IK?b~Bx0`3@S0+598D<5rK--kOwpw3#y` z^yuOB7XWhXl#^UdS`%wbb9i+lj_?ob)Hwzh-%ZRk$Xjd3)CX*6$XuRMxA@j@F`$tG z&KR}xf{NXWgS&^RdAh5MZ*s>jMU7F3{`p3;r&Gev816A(XYB|!aHKY9mHRfSM{=cQ`e$A z>-iM3)$eubxemWAwf(jr5Oz0L!wAjblKXn-@TN&C6@nwwFT0|}Sx;N6)I1$8KPUSI z&M}1BlvtbW#L-WUwrojEf=tu>q+vH=)5&Z=_La$$eg@hjOglt&I)(R(Ds9UnzCf!$ zH#x2cN|kT-4sO|YdO2lXr}q`53h&ds&~;nGGU`*&JeLIB=%dX;MGZ@uA<^BtE>1dG z{e3U7DZp3A9iJ9@%j5|o>y$-_EyP#v5a#XgCRMfGrf@I$`aC%{tq%dv{e;Zi=_z&> zsN_?oUUH|0)U+%+}%~E8##;i9V=`a!Y00OscGI!yu2z5FeGq1+kB6J761^T|DQ_15RmYr zt1PU|R~6_&FCS}|FU6<=--$TTN4(;Si^~{o{6zd7>-m!#IAO2MyBT$38>_St*&xsB zx|>6`_WAOH^`wtd(!fnt%sTO<`|_t!R+4GZ{+{E{N>^r^f=_Bn6nmZLo%834=hgp| z;S#;Y=!s<^r=9Z2_a{gUx&~V$q(WdfGrLON^WG$zUBqWwT}<)IAYU5ZJ)LjWll-S-Plx!* z1V??`laYe?KYHc(b0mHK;Sy58dBQIU`l(sGv_m+R(lj4@HXreR@s_ir6PFc~jLv}l zKt$I=s`d!t`;k@g;2<)U77vOu6gKelG31HS%LRu3X)#0V5x0rwJcFyT%ZeWr;UQ|r zCeWrsYQqbDd=9m@rYiX>hdIKwvNQ2RQFa<5tJ5fRat>Xf<`g_xwns3fna-`bQ|Tem z(T}rl)+?ZaRW1u-tWRQChV--!ZDf$=AWOOA`wdOxk$zE^ z6tqB|<=%@%oC0)L`s7l8!&h84(=QioU?OS84Qe*v1l|hZ$@`4FlW5n7oaq#5%sUiD`!8#N?S^9I_~ou83J82NGL3TbM&H6!y}bA`xoD79TE?{1sSY0TbEp8V zZ~wSoPucuRY}9HE+pWHpq737)!q}K)y4gxpW(3=c9>28PX|vn$Y@crpYCb;nWjOR@ z`~FpFYACcK zK}p$ANcTzNfsb!lL$1kJm7e|v$v54+4U*;EA3fGzljhHk)R8JT<_fkFfYN{fO928kOz2|;R4W+Flc!wK(-vFcA06cV=_JkD=( zVF(&e7Wt-!ejDt^rsUxx8}nIZRFa_ZmfDZb1IJ8o88xBTCfBhiUC>83CzfM0?1ik% zv*zS(af-F3;jc&-y{~vIdqJu*XZRzZgQS0G{+`oHaQ0LqOnHP!bT zSD{;c5I2g%sqzw)t3KZrNtOk&bm~O+87mkl8W6Qg75d#QW#7PZU&x2e@l<59t&{F9 zJe6Vn*?4mtTc@?O8!Wllx85||aHpbJ{WQeCbmWC;VhK~Zem?pf|7+5E#E-th<+DNB z!6`%esV2UAT+W%$Y<9g$XzMkatPn2D6cfa~iPYfDPnDvS{HZ4swNoPD@jX4wa-P0= z>rk3HCS~kGFX0p7P`b6z&TQqq zzxuKuZWQ{aiUijRq#8J$cXP_0S-E&Z%b4<$E{Sil5I*c(Y`~gus0au0)PZ`9Q5Tt> ze0nn7{+tcd-i?c-oYrX6R-GY}ZpB~)MWW8Fy=?!}k!7%Su#vOq!tIe**SjB>mY%QV z$Zp?Q0Jq2ou#g<*(`~-Sy7wv6PxlJVt|BbX?|Lfpe?cewu;dE%gI#uzMuNq8ULQFi zBNl6xseb<-nbTUR=70bIkm!Hn{~JiwdeG7S%VQ#7qG+jWdd0JHB%ciQ*gq4l(i=Y_ ztJ6*ku)oZcvK|VH&E7u#fnx}knwd1K18$X|oV$ZaVpT|Nk@YN?cOlGF+H1*`5$0B1 znYgYL?Z@IYJhZdj#goKBIzA~3#v-&XdZ?#7#S^ixiTOhXwZNK*hHo1tttHX%h8=`i zJOg1r++?HLS@l&BDja;KMv=xcdIfsU%CbdzWXpV2n8Y!wmaLo6_D4 z>5~!q8(75qa|x;KF_*iIk1qk?U|ri)=QNA1!ue=)lGG)^@8I0&(TWMY3J(4X=^K&% zO)xR?3|!~|uWm7D^loU}`|r1=aEEpoal5Szz(z7vURtOmkl9~snc zp1C?!sx5H`v$Qq5okSv$c5ehUy)7y3ZpWi;aZ+#C=edV*(tMMOZgo$OG{LRU09hu7hO=>du z4ak)O^_xs#wBgc}zlDDR<8Qo(Nq`Hp|5p9oBN_jqR{+3wVhlA2vyhQ4kbn;G|Lh<2 zcTv&(=LIfu3>ypQpH&U`%lscB6-taF3*R53zcYaPKSowmm=qW-rj3Q1 zngxe^hy7#}7WCgd8Fc;(O5{tvU` Bm7f3r From 973f1afb1b81481dc965445cc2f21c18945ae0cb Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Mon, 6 Feb 2023 21:33:53 +0500 Subject: [PATCH 04/17] refact ef update --- AsbCloudDb/Model/IAsbCloudDbContext.cs | 3 +++ .../Repository/UserRepository.cs | 22 +++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/AsbCloudDb/Model/IAsbCloudDbContext.cs b/AsbCloudDb/Model/IAsbCloudDbContext.cs index 4eac95f9..debd4de6 100644 --- a/AsbCloudDb/Model/IAsbCloudDbContext.cs +++ b/AsbCloudDb/Model/IAsbCloudDbContext.cs @@ -1,8 +1,10 @@ using AsbCloudDb.Model.Subsystems; using AsbCloudDb.Model.WITS; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Infrastructure; using System; +using System.Diagnostics.CodeAnalysis; using System.Threading; using System.Threading.Tasks; @@ -70,6 +72,7 @@ namespace AsbCloudDb.Model Task SaveChangesAsync(CancellationToken cancellationToken); DbSet Set(string name) where TEntity : class; DbSet Set() where TEntity : class; + EntityEntry Entry([NotNull] TEntity entity) where TEntity : class; } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index 0b5a3a58..9363409e 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -103,16 +103,24 @@ namespace AsbCloudInfrastructure.Repository var userRoles = await userRoleRepository.GetByNamesAsync(dto.RoleNames, token).ConfigureAwait(false); await UpdateRolesCacheForUserAsync(dto.Id, userRoles, token); - var userInDb = dbContext.Users.FirstOrDefault(u => u.Id == dto.Id); - if (userInDb is not null) - { - userInDb = Convert(dto); - await dbContext.SaveChangesAsync(token); - } + + var entity = Convert(dto); + + var local = dbContext.Set() + .Local + .FirstOrDefault(entry => entry.Id.Equals(entity.Id)); + if (local != null) + { + dbContext.Entry(local).State = EntityState.Detached; + } + dbContext.Entry(entity).State = EntityState.Modified; + await dbContext.SaveChangesAsync(token); DropCacheUsers(); - return userInDb!.Id; + return entity.Id; } + + public async Task DeleteAsync(int id, CancellationToken token) { var dto = (await GetCacheUserAsync(token)).FirstOrDefault(u => u.Id == id); From 54178e89232c61001134abf9454d41297f09588f Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Mon, 6 Feb 2023 21:56:27 +0500 Subject: [PATCH 05/17] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BE=D0=BF=D0=B5=D1=87=D0=B0=D1=82=D0=BE=D0=BA=20=D0=B8=20"?= =?UTF-8?q?=D0=BC=D1=83=D1=81=D0=BE=D1=80=D0=B0"=20=D0=BF=D0=BE=D1=81?= =?UTF-8?q?=D0=BB=D0=B5=20=D0=B4=D0=B5=D0=B1=D0=B0=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudInfrastructure/Repository/UserRepository.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index 9363409e..9148e87b 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -59,13 +59,11 @@ namespace AsbCloudInfrastructure.Repository public async Task> GetAllAsync(CancellationToken token) { - var dtos = (await GetCacheUserAsync(token)).ToList(); - var listDtos = dtos.ToList(); + var dtos = (await GetCacheUserAsync(token)).ToList(); if (dtos is null) return Enumerable.Empty(); - - for (var i = 0; i < listDtos.Count; i++) - listDtos[i].RoleNames = GetRolesNamesByIdUser(listDtos[i].Id); + for (var i = 0; i < dtos.Count; i++) + dtos[i].RoleNames = GetRolesNamesByIdUser(dtos[i].Id); return dtos; } @@ -301,7 +299,7 @@ namespace AsbCloudInfrastructure.Repository protected virtual User Convert(UserExtendedDto dto) { - var entity = dto.Adapt(userTypeAdapterConfig); + var entity = dto.Adapt(userTypeAdapterConfig); if (string.IsNullOrEmpty(entity.PasswordHash)) entity.PasswordHash = dbContext.Users.FirstOrDefault(u => u.Id == dto.Id)?.PasswordHash; return entity; From d83555fd46a2d1db82705c58a95df44be190226d Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 8 Feb 2023 10:42:54 +0500 Subject: [PATCH 06/17] =?UTF-8?q?1.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20api=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20GetDrillP?= =?UTF-8?q?rocessMap=20=D0=B2=20ProcessMapController,=20=D0=BA=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D1=8B=D0=B9=20=D0=BE=D1=82=D0=B4=D0=B0=D0=B5=D1=82?= =?UTF-8?q?=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=BD=D0=BE=D0=B9=20=D0=BA=D0=B0?= =?UTF-8?q?=D1=80=D1=82=D1=8B=20=D0=BF=D0=BE=20=D0=B1=D1=83=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8E=202.=20=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B1?= =?UTF-8?q?=D0=B0=D0=B3=D0=B0=20=D0=BF=D0=BE=20=D1=80=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=B4=D0=B5=D1=80=D1=83=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= =?UTF-8?q?=20=D1=81=D0=BB=D0=B0=D0=B9=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProcessMap/ProcessMapReportService.cs | 2 +- .../Controllers/ProcessMapController.cs | 31 ++++++++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs index 2fe5b180..9cdc30af 100644 --- a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs @@ -108,7 +108,7 @@ namespace AsbCloudInfrastructure.Services.ProcessMap .SetVal(interval.MechDrillingHours); row = FillIntervalModeData(sheet, "Ротор", interval.Rotor, columnMode, row); - row = FillIntervalModeData(sheet, "Слайд", interval.Rotor, columnMode, row); + row = FillIntervalModeData(sheet, "Слайд", interval.Slide, columnMode, row); return row; } diff --git a/AsbCloudWebApi/Controllers/ProcessMapController.cs b/AsbCloudWebApi/Controllers/ProcessMapController.cs index f5c955aa..f5cb19a7 100644 --- a/AsbCloudWebApi/Controllers/ProcessMapController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMapController.cs @@ -1,5 +1,7 @@ using AsbCloudApp.Data.ProcessMap; using AsbCloudApp.Services; +using AsbCloudDb.Model; +using AsbCloudInfrastructure.Services.ProcessMap; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System; @@ -21,13 +23,20 @@ namespace AsbCloudWebApi.Controllers { private readonly ITelemetryService telemetryService; private readonly IProcessMapReportService processMapReportService; + private readonly IProcessMapService processMapService; - public ProcessMapController(IWellService wellService, IProcessMapRepository repository, IProcessMapReportService processMapReportService, + public ProcessMapController( + IWellService wellService, + IProcessMapRepository repository, + IProcessMapReportService processMapReportService, + IProcessMapService processMapService, ITelemetryService telemetryService) : base(wellService, repository) { this.telemetryService = telemetryService; this.processMapReportService = processMapReportService; + this.processMapService = processMapService; + } /// @@ -103,6 +112,26 @@ namespace AsbCloudWebApi.Controllers return NoContent(); } + /// + /// Выгрузка режимной карты по бурению скважины + /// + /// + /// + /// + [HttpGet] + [Route("getDrillProcessMap/{wellId}")] + [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + public async Task GetDrillProcessMap(int wellId, CancellationToken token) + { + var data = await processMapService.GetProcessMapAsync(wellId, token); + if (data != null) + { + return Ok(data); + } + else + return NoContent(); + } + /// /// Добавить запись /// From d35550380c12ee3cd66dd6089df83a10ae635807 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Wed, 8 Feb 2023 15:12:46 +0500 Subject: [PATCH 07/17] refact update role method --- AsbCloudDb/Model/AsbCloudDbContext.cs | 3 +++ AsbCloudDb/Model/IAsbCloudDbContext.cs | 1 + .../Repository/UserRepository.cs | 18 ++++++++++-------- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/AsbCloudDb/Model/AsbCloudDbContext.cs b/AsbCloudDb/Model/AsbCloudDbContext.cs index afce3792..12805e60 100644 --- a/AsbCloudDb/Model/AsbCloudDbContext.cs +++ b/AsbCloudDb/Model/AsbCloudDbContext.cs @@ -1,5 +1,6 @@ using AsbCloudDb.Model.Subsystems; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.ChangeTracking; using System.Threading; using System.Threading.Tasks; @@ -362,5 +363,7 @@ namespace AsbCloudDb.Model var sql = $"REFRESH MATERIALIZED VIEW {materializedViewName};"; return Database.ExecuteSqlRawAsync(sql, token); } + + public ChangeTracker GetChangeTracker() => ChangeTracker; } } diff --git a/AsbCloudDb/Model/IAsbCloudDbContext.cs b/AsbCloudDb/Model/IAsbCloudDbContext.cs index debd4de6..c2080c72 100644 --- a/AsbCloudDb/Model/IAsbCloudDbContext.cs +++ b/AsbCloudDb/Model/IAsbCloudDbContext.cs @@ -73,6 +73,7 @@ namespace AsbCloudDb.Model DbSet Set(string name) where TEntity : class; DbSet Set() where TEntity : class; EntityEntry Entry([NotNull] TEntity entity) where TEntity : class; + ChangeTracker GetChangeTracker(); } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index 9148e87b..1668fc6a 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -107,7 +107,7 @@ namespace AsbCloudInfrastructure.Repository var local = dbContext.Set() .Local .FirstOrDefault(entry => entry.Id.Equals(entity.Id)); - if (local != null) + if (local is not null) { dbContext.Entry(local).State = EntityState.Detached; } @@ -117,8 +117,6 @@ namespace AsbCloudInfrastructure.Repository return entity.Id; } - - public async Task DeleteAsync(int id, CancellationToken token) { var dto = (await GetCacheUserAsync(token)).FirstOrDefault(u => u.Id == id); @@ -221,7 +219,7 @@ namespace AsbCloudInfrastructure.Repository var relations = (await GetCacheRelationUserUserRoleAsync(token)).Where(r => r.IdUser == idUser); dbContext.RelationUserUserRoles.RemoveRange(relations); - if (newRoles?.Any() == true) + if (newRoles?.Any() is true) await dbContext.RelationUserUserRoles.AddRangeAsync(newRoles.Select(role => new RelationUserUserRole { IdUser = idUser, @@ -236,7 +234,8 @@ namespace AsbCloudInfrastructure.Repository where TEntity : class { async Task factory(CancellationToken token) - => await query.AsNoTracking().ToArrayAsync(token); + => await query.ToArrayAsync(token); + dbContext.GetChangeTracker().Clear(); var cache = await GetOrAddCacheAsync(tag, factory, obsolescence, token); return cache.Select(convert); } @@ -244,7 +243,8 @@ namespace AsbCloudInfrastructure.Repository where TEntity : class { async Task factory(CancellationToken token) - => await query.AsNoTracking().ToArrayAsync(token); + => await query.ToArrayAsync(token); + dbContext.GetChangeTracker().Clear(); var cache = await GetOrAddCacheAsync(tag, factory, obsolescence, token); return cache; } @@ -252,7 +252,8 @@ namespace AsbCloudInfrastructure.Repository where TEntity : class { TEntity[] factory() - => query.AsNoTracking().ToArray(); + => query.ToArray(); + dbContext.GetChangeTracker().Clear(); var cache = GetOrAddCache(tag, factory, obsolescence); return cache.Select(convert); } @@ -260,7 +261,8 @@ namespace AsbCloudInfrastructure.Repository where TEntity : class { TEntity[] factory() - => query.AsNoTracking().ToArray(); + => query.ToArray(); + dbContext.GetChangeTracker().Clear(); var cache = GetOrAddCache(tag, factory, obsolescence); return cache; } From 8c579fe5b7bf92f71da1122c2e318829caed83be Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 8 Feb 2023 15:46:16 +0500 Subject: [PATCH 08/17] =?UTF-8?q?1.=20=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D0=B5=20=D1=8E=D0=B7=D0=B8?= =?UTF-8?q?=D0=BD=D0=B3=D0=B8=20+=20=D0=BB=D0=B8=D1=88=D0=BD=D1=8F=D1=8F?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B0=20null=202.=20=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=B2=D1=8B=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProcessMap/ProcessMapReportService.cs | 4 ++-- .../ProcessMap/ProcessMapReportTemplate.xlsx | Bin 7570 -> 9177 bytes .../Controllers/ProcessMapController.cs | 13 +++---------- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs index 9cdc30af..923a6bf5 100644 --- a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs @@ -13,7 +13,7 @@ namespace AsbCloudInfrastructure.Services.ProcessMap public class ProcessMapReportService : IProcessMapReportService { const int firstColumn = 2; - const int lastColumn = 30; + const int lastColumn = 61; const int headerRowsCount = 8; @@ -122,7 +122,7 @@ namespace AsbCloudInfrastructure.Services.ProcessMap int columnSpeed = columnTorque + 5; int columnUsagePlan = columnSpeed + 5; int columnUsageFact = columnUsagePlan + 1; - int columnRop = columnUsageFact + 1; + int columnRop = columnUsageFact + 12; sheet.Cell(row, column) .SetVal(modeName); diff --git a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportTemplate.xlsx b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportTemplate.xlsx index e716a80835311240d6ee20fc8812d0c03eb330eb..65b418cc90308c683f9812d869fd5e0f7ddc45ae 100644 GIT binary patch delta 6834 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 Qq#{GW=)joDOn=tMLq@+VaLSR7<1SF)p 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 diff --git a/AsbCloudWebApi/Controllers/ProcessMapController.cs b/AsbCloudWebApi/Controllers/ProcessMapController.cs index f5cb19a7..6f26f939 100644 --- a/AsbCloudWebApi/Controllers/ProcessMapController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMapController.cs @@ -1,7 +1,5 @@ using AsbCloudApp.Data.ProcessMap; using AsbCloudApp.Services; -using AsbCloudDb.Model; -using AsbCloudInfrastructure.Services.ProcessMap; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System; @@ -26,8 +24,8 @@ namespace AsbCloudWebApi.Controllers private readonly IProcessMapService processMapService; public ProcessMapController( - IWellService wellService, - IProcessMapRepository repository, + IWellService wellService, + IProcessMapRepository repository, IProcessMapReportService processMapReportService, IProcessMapService processMapService, ITelemetryService telemetryService) @@ -124,12 +122,7 @@ namespace AsbCloudWebApi.Controllers public async Task GetDrillProcessMap(int wellId, CancellationToken token) { var data = await processMapService.GetProcessMapAsync(wellId, token); - if (data != null) - { - return Ok(data); - } - else - return NoContent(); + return Ok(data); } /// From f7a58cfa12c8217a9d5b4ecfabf1a3586e6ee3cd Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Thu, 9 Feb 2023 11:38:04 +0500 Subject: [PATCH 09/17] refact --- AsbCloudDb/Model/AsbCloudDbContext.cs | 5 +---- AsbCloudDb/Model/IAsbCloudDbContext.cs | 2 -- .../Repository/UserRepository.cs | 14 +------------- 3 files changed, 2 insertions(+), 19 deletions(-) diff --git a/AsbCloudDb/Model/AsbCloudDbContext.cs b/AsbCloudDb/Model/AsbCloudDbContext.cs index 12805e60..a43f55c1 100644 --- a/AsbCloudDb/Model/AsbCloudDbContext.cs +++ b/AsbCloudDb/Model/AsbCloudDbContext.cs @@ -1,6 +1,5 @@ using AsbCloudDb.Model.Subsystems; using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.ChangeTracking; using System.Threading; using System.Threading.Tasks; @@ -362,8 +361,6 @@ namespace AsbCloudDb.Model { var sql = $"REFRESH MATERIALIZED VIEW {materializedViewName};"; return Database.ExecuteSqlRawAsync(sql, token); - } - - public ChangeTracker GetChangeTracker() => ChangeTracker; + } } } diff --git a/AsbCloudDb/Model/IAsbCloudDbContext.cs b/AsbCloudDb/Model/IAsbCloudDbContext.cs index c2080c72..8e117f71 100644 --- a/AsbCloudDb/Model/IAsbCloudDbContext.cs +++ b/AsbCloudDb/Model/IAsbCloudDbContext.cs @@ -73,7 +73,5 @@ namespace AsbCloudDb.Model DbSet Set(string name) where TEntity : class; DbSet Set() where TEntity : class; EntityEntry Entry([NotNull] TEntity entity) where TEntity : class; - ChangeTracker GetChangeTracker(); - } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index 1668fc6a..fe8979b7 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -194,14 +194,6 @@ namespace AsbCloudInfrastructure.Repository { memoryCache.Remove(userCacheTag); } - - private async Task> GetCacheRelationUserUserRoleAsync(CancellationToken token) - { - var query = dbContext.RelationUserUserRoles - .Include(r => r.UserRole) - .Include(r => r.User); - return await FromCacheAsync(query, relationUserUserRoleCacheTag, cacheObsolence, token); - } private IEnumerable GetCachRelationUserUserRoleCacheTag() { var query = dbContext.RelationUserUserRoles @@ -216,7 +208,7 @@ namespace AsbCloudInfrastructure.Repository private async Task UpdateRolesCacheForUserAsync(int idUser, IEnumerable newRoles, CancellationToken token) { - var relations = (await GetCacheRelationUserUserRoleAsync(token)).Where(r => r.IdUser == idUser); + var relations = dbContext.RelationUserUserRoles.Where(r => r.IdUser == idUser); dbContext.RelationUserUserRoles.RemoveRange(relations); if (newRoles?.Any() is true) @@ -235,7 +227,6 @@ namespace AsbCloudInfrastructure.Repository { async Task factory(CancellationToken token) => await query.ToArrayAsync(token); - dbContext.GetChangeTracker().Clear(); var cache = await GetOrAddCacheAsync(tag, factory, obsolescence, token); return cache.Select(convert); } @@ -244,7 +235,6 @@ namespace AsbCloudInfrastructure.Repository { async Task factory(CancellationToken token) => await query.ToArrayAsync(token); - dbContext.GetChangeTracker().Clear(); var cache = await GetOrAddCacheAsync(tag, factory, obsolescence, token); return cache; } @@ -253,7 +243,6 @@ namespace AsbCloudInfrastructure.Repository { TEntity[] factory() => query.ToArray(); - dbContext.GetChangeTracker().Clear(); var cache = GetOrAddCache(tag, factory, obsolescence); return cache.Select(convert); } @@ -262,7 +251,6 @@ namespace AsbCloudInfrastructure.Repository { TEntity[] factory() => query.ToArray(); - dbContext.GetChangeTracker().Clear(); var cache = GetOrAddCache(tag, factory, obsolescence); return cache; } From 95790af1f673571ea2640cc2f49f65235dc9c891 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Mon, 13 Feb 2023 15:39:17 +0500 Subject: [PATCH 10/17] new change to cache methods --- .../Repository/UserRepository.cs | 192 ++++++++---------- 1 file changed, 81 insertions(+), 111 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index fe8979b7..d5023f90 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -59,30 +59,36 @@ namespace AsbCloudInfrastructure.Repository public async Task> GetAllAsync(CancellationToken token) { - var dtos = (await GetCacheUserAsync(token)).ToList(); - if (dtos is null) + var users = await GetCacheUserAsync(token); + if (users is null) return Enumerable.Empty(); - for (var i = 0; i < dtos.Count; i++) - dtos[i].RoleNames = GetRolesNamesByIdUser(dtos[i].Id); + var dtos = users + .Select(d => Convert(d)); + foreach(var dto in dtos) + { + dto.RoleNames = GetRolesNamesByIdUser(dto.Id); + }; + return dtos; } + public UserExtendedDto? GetOrDefault(int id) { - var dto = GetCacheUser().FirstOrDefault(u => u.Id == id); - if (dto is null) + var user = GetCacheUser().FirstOrDefault(u => u.Id == id); + if (user is null) return null; - var entity = Convert(dto); + var dto = Convert(user); dto.RoleNames = GetRolesNamesByIdUser(dto.Id); return dto; } public async Task GetOrDefaultAsync(int id, CancellationToken token) - { - var dto = (await GetCacheUserAsync(token)).FirstOrDefault(u => u.Id == id); - if (dto is null) + { + var user = (await GetCacheUserAsync(token)).FirstOrDefault(u => u.Id == id); + if (user is null) return null; - + var dto = Convert(user); dto.RoleNames = GetRolesNamesByIdUser(dto.Id); return dto; } @@ -102,29 +108,33 @@ namespace AsbCloudInfrastructure.Repository var userRoles = await userRoleRepository.GetByNamesAsync(dto.RoleNames, token).ConfigureAwait(false); await UpdateRolesCacheForUserAsync(dto.Id, userRoles, token); - var entity = Convert(dto); - - var local = dbContext.Set() - .Local - .FirstOrDefault(entry => entry.Id.Equals(entity.Id)); - if (local is not null) - { - dbContext.Entry(local).State = EntityState.Detached; - } - dbContext.Entry(entity).State = EntityState.Modified; - await dbContext.SaveChangesAsync(token); + var entity = dbContext.Users.FirstOrDefault(u => u.Id == dto.Id); + if (entity is not null) + { + var user = Convert(dto); + entity.Id = user.Id; + entity.Company = user.Company; + entity.Name = user.Name; + entity.Email = user.Email; + entity.Phone = user.Phone; + entity.Surname = user.Surname; + entity.Patronymic = user.Patronymic; + entity.Position = user.Position; + entity.IdCompany = user.IdCompany; + entity.IdState = user.IdState; + entity.RelationUsersUserRoles = user.RelationUsersUserRoles; + await dbContext.SaveChangesAsync(token); + } DropCacheUsers(); - return entity.Id; + return entity!.Id; } public async Task DeleteAsync(int id, CancellationToken token) { - var dto = (await GetCacheUserAsync(token)).FirstOrDefault(u => u.Id == id); - if (dto is null) - return 0; - - var entity = Convert(dto); - var result = dbContext.Users.Remove(entity); + var user = (await GetCacheUserAsync(token)).FirstOrDefault(u => u.Id == id); + if (user is null) + return 0; + var result = dbContext.Users.Remove(user); await dbContext.SaveChangesAsync(token); DropCacheUsers(); return result.Entity.Id; @@ -174,33 +184,23 @@ namespace AsbCloudInfrastructure.Repository if (existingUserDto is not null) throw new ArgumentInvalidException($"Login {login} is busy by {existingUserDto.MakeDisplayName()}, id{existingUserDto.Id}", nameof(login)); - } - - private async Task> GetCacheUserAsync(CancellationToken token) - { - var query = dbContext.Users - .Include(r => r.Company) - .Include(r => r.RelationUsersUserRoles); - return await FromCacheAsync(query, userCacheTag, cacheObsolence, Convert, token); - } - private IEnumerable GetCacheUser() - { - var query = dbContext.Users - .Include(r => r.Company) - .Include(r => r.RelationUsersUserRoles); - return FromCache(query, userCacheTag, cacheObsolence, Convert); - } - private void DropCacheUsers() - { - memoryCache.Remove(userCacheTag); - } + } + + private IEnumerable GetCachRelationUserUserRoleCacheTag() { - var query = dbContext.RelationUserUserRoles + var cache = memoryCache.GetOrCreate(userCacheTag, cacheEntry => + { + cacheEntry.AbsoluteExpirationRelativeToNow = cacheObsolence; + cacheEntry.SlidingExpiration = cacheObsolence; + var query = dbContext.RelationUserUserRoles .Include(r => r.UserRole) .Include(r => r.User); - return FromCache(query, relationUserUserRoleCacheTag, cacheObsolence); - } + var entities = query.ToArray(); + return entities; + }); + return cache; + } private void DropCacheRelationUserUserRoleCacheTag() { memoryCache.Remove(relationUserUserRoleCacheTag); @@ -222,72 +222,40 @@ namespace AsbCloudInfrastructure.Repository DropCacheRelationUserUserRoleCacheTag(); } - public async Task> FromCacheAsync(IQueryable query, string tag, TimeSpan obsolescence, Func convert, CancellationToken token) - where TEntity : class + private void DropCacheUsers() + => memoryCache.Remove(userCacheTag); + + private IEnumerable GetCacheUser() { - async Task factory(CancellationToken token) - => await query.ToArrayAsync(token); - var cache = await GetOrAddCacheAsync(tag, factory, obsolescence, token); - return cache.Select(convert); - } - public async Task> FromCacheAsync(IQueryable query, string tag, TimeSpan obsolescence, CancellationToken token) - where TEntity : class - { - async Task factory(CancellationToken token) - => await query.ToArrayAsync(token); - var cache = await GetOrAddCacheAsync(tag, factory, obsolescence, token); + var cache = memoryCache.GetOrCreate(userCacheTag, cacheEntry => + { + cacheEntry.AbsoluteExpirationRelativeToNow = cacheObsolence; + cacheEntry.SlidingExpiration = cacheObsolence; + var query = dbContext.Users + .Include(r => r.Company) + .Include(r => r.RelationUsersUserRoles); + var entities = query.ToArray(); + return entities; + }); return cache; } - public IEnumerable FromCache(IQueryable query, string tag, TimeSpan obsolescence, Func convert) - where TEntity : class + + private Task> GetCacheUserAsync(CancellationToken token) { - TEntity[] factory() - => query.ToArray(); - var cache = GetOrAddCache(tag, factory, obsolescence); - return cache.Select(convert); - } - public IEnumerable FromCache(IQueryable query, string tag, TimeSpan obsolescence) - where TEntity : class - { - TEntity[] factory() - => query.ToArray(); - var cache = GetOrAddCache(tag, factory, obsolescence); + var cache = memoryCache.GetOrCreateAsync(userCacheTag, async (cacheEntry) => + { + cacheEntry.AbsoluteExpirationRelativeToNow = cacheObsolence; + cacheEntry.SlidingExpiration = cacheObsolence; + var query = dbContext.Users + .Include(r => r.Company) + .Include(r => r.RelationUsersUserRoles); + var entities = await query.ToArrayAsync(token); + return entities.AsEnumerable(); + }); return cache; } - private async Task GetOrAddCacheAsync(string tag, Func> valueFactoryAsync, TimeSpan obsolete, CancellationToken token) - - { - memoryCache.TryGetValue(tag, out TEntity[]? cached); - if (cached == null) - { - var values = await valueFactoryAsync(token); - - if (values != null) - { - memoryCache.Set(tag, values, new MemoryCacheEntryOptions().SetAbsoluteExpiration(obsolete)); - } - return values!; - } - return cached; - } - private TEntity[] GetOrAddCache(string tag, Func valueFactory, TimeSpan obsolete) - { - memoryCache.TryGetValue(tag, out TEntity[]? cached); - if (cached == null) - { - var values = valueFactory(); - - if (values != null) - { - memoryCache.Set(tag, values, new MemoryCacheEntryOptions().SetAbsoluteExpiration(obsolete)); - } - return values!; - } - return cached; - } - - protected virtual User Convert(UserExtendedDto dto) + protected User Convert(UserExtendedDto dto) { var entity = dto.Adapt(userTypeAdapterConfig); if (string.IsNullOrEmpty(entity.PasswordHash)) @@ -295,6 +263,8 @@ namespace AsbCloudInfrastructure.Repository return entity; } + + protected virtual UserExtendedDto Convert(User entity) { var dto = entity.Adapt(); From 6bf992f1f69e8d4d348ea69511e0fe9e7cac2d81 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Mon, 13 Feb 2023 23:11:39 +0500 Subject: [PATCH 11/17] =?UTF-8?q?=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=BE=D0=B2?= =?UTF-8?q?=20=D1=80=D0=B5=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudDb/Model/IAsbCloudDbContext.cs | 3 +-- .../Repository/UserRepository.cs | 27 +++++++++---------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/AsbCloudDb/Model/IAsbCloudDbContext.cs b/AsbCloudDb/Model/IAsbCloudDbContext.cs index 8e117f71..60fa41d0 100644 --- a/AsbCloudDb/Model/IAsbCloudDbContext.cs +++ b/AsbCloudDb/Model/IAsbCloudDbContext.cs @@ -71,7 +71,6 @@ namespace AsbCloudDb.Model int SaveChanges(bool acceptAllChangesOnSuccess); Task SaveChangesAsync(CancellationToken cancellationToken); DbSet Set(string name) where TEntity : class; - DbSet Set() where TEntity : class; - EntityEntry Entry([NotNull] TEntity entity) where TEntity : class; + DbSet Set() where TEntity : class; } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index d5023f90..7873a4e9 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -121,8 +121,7 @@ namespace AsbCloudInfrastructure.Repository entity.Patronymic = user.Patronymic; entity.Position = user.Position; entity.IdCompany = user.IdCompany; - entity.IdState = user.IdState; - entity.RelationUsersUserRoles = user.RelationUsersUserRoles; + entity.IdState = user.IdState; await dbContext.SaveChangesAsync(token); } DropCacheUsers(); @@ -199,25 +198,19 @@ namespace AsbCloudInfrastructure.Repository var entities = query.ToArray(); return entities; }); - return cache; + return cache!; } private void DropCacheRelationUserUserRoleCacheTag() { memoryCache.Remove(relationUserUserRoleCacheTag); } - private async Task UpdateRolesCacheForUserAsync(int idUser, IEnumerable newRoles, CancellationToken token) + private async Task UpdateRolesCacheForUserAsync(int idUser, IEnumerable roleDtos, CancellationToken token) { var relations = dbContext.RelationUserUserRoles.Where(r => r.IdUser == idUser); dbContext.RelationUserUserRoles.RemoveRange(relations); - - if (newRoles?.Any() is true) - await dbContext.RelationUserUserRoles.AddRangeAsync(newRoles.Select(role => new RelationUserUserRole - { - IdUser = idUser, - IdUserRole = role.Id - }), token).ConfigureAwait(false); - + var entityRoles = roleDtos.Select(role => Convert(role)); + dbContext.RelationUserUserRoles.AddRange(entityRoles); await dbContext.SaveChangesAsync(token); DropCacheRelationUserUserRoleCacheTag(); } @@ -237,7 +230,7 @@ namespace AsbCloudInfrastructure.Repository var entities = query.ToArray(); return entities; }); - return cache; + return cache!; } private Task> GetCacheUserAsync(CancellationToken token) @@ -252,7 +245,7 @@ namespace AsbCloudInfrastructure.Repository var entities = await query.ToArrayAsync(token); return entities.AsEnumerable(); }); - return cache; + return cache!; } protected User Convert(UserExtendedDto dto) @@ -263,7 +256,11 @@ namespace AsbCloudInfrastructure.Repository return entity; } - + protected RelationUserUserRole Convert(UserRoleDto dto) + { + var entity = dto.Adapt(); + return entity; + } protected virtual UserExtendedDto Convert(User entity) { From 2cc8abd7677e544510f0a1f9e240fbe9b8e14ea7 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Tue, 14 Feb 2023 12:20:29 +0500 Subject: [PATCH 12/17] =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudDb/Model/IAsbCloudDbContext.cs | 5 +-- .../Repository/UserRepository.cs | 38 ++++++++----------- 2 files changed, 17 insertions(+), 26 deletions(-) diff --git a/AsbCloudDb/Model/IAsbCloudDbContext.cs b/AsbCloudDb/Model/IAsbCloudDbContext.cs index 60fa41d0..446a7656 100644 --- a/AsbCloudDb/Model/IAsbCloudDbContext.cs +++ b/AsbCloudDb/Model/IAsbCloudDbContext.cs @@ -1,10 +1,8 @@ using AsbCloudDb.Model.Subsystems; using AsbCloudDb.Model.WITS; using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Infrastructure; using System; -using System.Diagnostics.CodeAnalysis; using System.Threading; using System.Threading.Tasks; @@ -69,8 +67,7 @@ namespace AsbCloudDb.Model Task RefreshMaterializedViewAsync(CancellationToken token) where TEntity : class; int SaveChanges(); int SaveChanges(bool acceptAllChangesOnSuccess); - Task SaveChangesAsync(CancellationToken cancellationToken); - DbSet Set(string name) where TEntity : class; + Task SaveChangesAsync(CancellationToken cancellationToken); DbSet Set() where TEntity : class; } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index 7873a4e9..e1ca6c19 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -67,8 +67,7 @@ namespace AsbCloudInfrastructure.Repository foreach(var dto in dtos) { dto.RoleNames = GetRolesNamesByIdUser(dto.Id); - }; - + }; return dtos; } @@ -110,18 +109,16 @@ namespace AsbCloudInfrastructure.Repository var entity = dbContext.Users.FirstOrDefault(u => u.Id == dto.Id); if (entity is not null) - { - var user = Convert(dto); - entity.Id = user.Id; - entity.Company = user.Company; - entity.Name = user.Name; - entity.Email = user.Email; - entity.Phone = user.Phone; - entity.Surname = user.Surname; - entity.Patronymic = user.Patronymic; - entity.Position = user.Position; - entity.IdCompany = user.IdCompany; - entity.IdState = user.IdState; + { + entity.Id = dto.Id; + entity.Name = dto.Name; + entity.Email = dto.Email; + entity.Phone = dto.Phone; + entity.Surname = dto.Surname; + entity.Patronymic = dto.Patronymic; + entity.Position = dto.Position; + entity.IdCompany = dto.IdCompany; + entity.IdState = dto.IdState; await dbContext.SaveChangesAsync(token); } DropCacheUsers(); @@ -209,7 +206,11 @@ namespace AsbCloudInfrastructure.Repository { var relations = dbContext.RelationUserUserRoles.Where(r => r.IdUser == idUser); dbContext.RelationUserUserRoles.RemoveRange(relations); - var entityRoles = roleDtos.Select(role => Convert(role)); + var entityRoles = roleDtos.Select(role => new RelationUserUserRole + { + IdUser = idUser, + IdUserRole = role.Id + }); dbContext.RelationUserUserRoles.AddRange(entityRoles); await dbContext.SaveChangesAsync(token); DropCacheRelationUserUserRoleCacheTag(); @@ -255,13 +256,6 @@ namespace AsbCloudInfrastructure.Repository entity.PasswordHash = dbContext.Users.FirstOrDefault(u => u.Id == dto.Id)?.PasswordHash; return entity; } - - protected RelationUserUserRole Convert(UserRoleDto dto) - { - var entity = dto.Adapt(); - return entity; - } - protected virtual UserExtendedDto Convert(User entity) { var dto = entity.Adapt(); From 2b02bdb0b895e7dde52c83e668cb2f8a07a5a992 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Tue, 14 Feb 2023 12:30:05 +0500 Subject: [PATCH 13/17] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=20=D1=80=D0=B5=D0=B4=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=81=D0=BE=D0=B3=D0=BB=D0=B0=D1=81=D0=BD=D0=BE?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=B4-=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repository/UserRepository.cs | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index e1ca6c19..fa69ac0d 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -108,21 +108,20 @@ namespace AsbCloudInfrastructure.Repository await UpdateRolesCacheForUserAsync(dto.Id, userRoles, token); var entity = dbContext.Users.FirstOrDefault(u => u.Id == dto.Id); - if (entity is not null) - { - entity.Id = dto.Id; - entity.Name = dto.Name; - entity.Email = dto.Email; - entity.Phone = dto.Phone; - entity.Surname = dto.Surname; - entity.Patronymic = dto.Patronymic; - entity.Position = dto.Position; - entity.IdCompany = dto.IdCompany; - entity.IdState = dto.IdState; - await dbContext.SaveChangesAsync(token); - } + if (entity is null) + return -1; + entity.Id = dto.Id; + entity.Name = dto.Name; + entity.Email = dto.Email; + entity.Phone = dto.Phone; + entity.Surname = dto.Surname; + entity.Patronymic = dto.Patronymic; + entity.Position = dto.Position; + entity.IdCompany = dto.IdCompany; + entity.IdState = dto.IdState; + await dbContext.SaveChangesAsync(token); DropCacheUsers(); - return entity!.Id; + return entity.Id; } public async Task DeleteAsync(int id, CancellationToken token) From 96dae2f247c882811c7117a53593d122f8b28544 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Tue, 14 Feb 2023 18:36:25 +0500 Subject: [PATCH 14/17] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE?= =?UTF-8?q?=D0=BA=20=D0=B2=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repository/UserRepository.cs | 42 ++++++++++++------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index fa69ac0d..5648b21b 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -62,11 +62,12 @@ namespace AsbCloudInfrastructure.Repository var users = await GetCacheUserAsync(token); if (users is null) return Enumerable.Empty(); - var dtos = users - .Select(d => Convert(d)); - foreach(var dto in dtos) + var dtos = new List(); + foreach(var user in users) { - dto.RoleNames = GetRolesNamesByIdUser(dto.Id); + var dto = Convert(user); + dto.RoleNames = GetRolesNamesByIdUser(user.Id); + dtos.Add(dto); }; return dtos; } @@ -111,6 +112,7 @@ namespace AsbCloudInfrastructure.Repository if (entity is null) return -1; entity.Id = dto.Id; + entity.Login = dto.Login; entity.Name = dto.Name; entity.Email = dto.Email; entity.Phone = dto.Phone; @@ -128,11 +130,18 @@ namespace AsbCloudInfrastructure.Repository { var user = (await GetCacheUserAsync(token)).FirstOrDefault(u => u.Id == id); if (user is null) - return 0; - var result = dbContext.Users.Remove(user); - await dbContext.SaveChangesAsync(token); - DropCacheUsers(); - return result.Entity.Id; + return 0; + var query = dbContext + .Users + .Where(u => u.Id == id); + if (query.Any()) + { + var result = dbContext.Users.Remove(query.First()); + await dbContext.SaveChangesAsync(token); + DropCacheUsers(); + return result.Entity.Id; + } + return -1; } public IEnumerable GetRolesByIdUser(int idUser, int nestedLevel = 0) @@ -168,9 +177,14 @@ namespace AsbCloudInfrastructure.Repository } private IEnumerable GetRolesNamesByIdUser(int idUser) - => GetRolesByIdUser(idUser, 7) - .Select(r => r.Caption) - .Distinct(); + { + var userRoles = GetRolesByIdUser(idUser, 7) + .Select(r => r.Caption) + .Distinct(); + if (userRoles.Any()) + return userRoles; + return Enumerable.Empty(); + } private async Task AssertLoginIsBusyAsync(string login, CancellationToken token) { @@ -184,7 +198,7 @@ namespace AsbCloudInfrastructure.Repository private IEnumerable GetCachRelationUserUserRoleCacheTag() { - var cache = memoryCache.GetOrCreate(userCacheTag, cacheEntry => + var cache = memoryCache.GetOrCreate(relationUserUserRoleCacheTag, cacheEntry => { cacheEntry.AbsoluteExpirationRelativeToNow = cacheObsolence; cacheEntry.SlidingExpiration = cacheObsolence; @@ -259,7 +273,7 @@ namespace AsbCloudInfrastructure.Repository { var dto = entity.Adapt(); return dto; - } + } } #nullable disable } From d2729c3a80b3be649e0b2caafd7a3a6af1950be3 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Wed, 15 Feb 2023 11:13:34 +0500 Subject: [PATCH 15/17] remove package --- AsbCloudInfrastructure/AsbCloudInfrastructure.csproj | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj index 84cf9062..bf643cc0 100644 --- a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj +++ b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj @@ -42,8 +42,7 @@ - - + From dbbd4d5603363d5de01d809719a8b7794020ad3e Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Wed, 15 Feb 2023 11:44:20 +0500 Subject: [PATCH 16/17] =?UTF-8?q?=D0=B5=D1=81=D0=BB=D0=B8=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=20?= =?UTF-8?q?=D0=BD=D0=B5=20=D0=BD=D0=B0=D0=B9=D0=B4=D0=B5=D0=BD=20=D0=B2=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=B5=20=D0=B2?= =?UTF-8?q?=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=89=D0=B0=D0=B5=D1=82=D1=81?= =?UTF-8?q?=D1=8F=20ArgumentInvalidException?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudInfrastructure/Repository/UserRepository.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index 5648b21b..d14a4727 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -96,7 +96,8 @@ namespace AsbCloudInfrastructure.Repository public async Task UpdateAsync(UserExtendedDto dto, CancellationToken token) { if (dto.Id <= 1) - throw new ArgumentInvalidException($"Invalid id {dto.Id}. You can't edit this user.", nameof(dto)); + throw new ArgumentInvalidException + ($"Invalid id {dto.Id}. You can't edit this user.", nameof(dto)); var oldUser = (await GetCacheUserAsync(token)).FirstOrDefault(u => u.Id == dto.Id); if (oldUser is null) @@ -110,7 +111,8 @@ namespace AsbCloudInfrastructure.Repository var entity = dbContext.Users.FirstOrDefault(u => u.Id == dto.Id); if (entity is null) - return -1; + throw new ArgumentInvalidException + ($"Invalid id {dto.Id}. You can't edit this user.", nameof(dto)); entity.Id = dto.Id; entity.Login = dto.Login; entity.Name = dto.Name; @@ -141,7 +143,8 @@ namespace AsbCloudInfrastructure.Repository DropCacheUsers(); return result.Entity.Id; } - return -1; + throw new ArgumentInvalidException + ($"Invalid id {id}. You can't edit this user.", nameof(id)); } public IEnumerable GetRolesByIdUser(int idUser, int nestedLevel = 0) From 707b8f8b3b1d43ee34032bd1d9a1851de33c731e Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Wed, 15 Feb 2023 14:00:46 +0500 Subject: [PATCH 17/17] 8543610 Add exceptions for badRequest --- AsbCloudInfrastructure/Repository/UserRepository.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index d14a4727..8ddbc5f3 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -101,7 +101,8 @@ namespace AsbCloudInfrastructure.Repository var oldUser = (await GetCacheUserAsync(token)).FirstOrDefault(u => u.Id == dto.Id); if (oldUser is null) - return 0; + throw new ArgumentInvalidException + ($"Invalid id {dto.Id}. You can't edit this user.", nameof(dto)); if (oldUser.Login != dto.Login) await AssertLoginIsBusyAsync(dto.Login, token); @@ -132,7 +133,8 @@ namespace AsbCloudInfrastructure.Repository { var user = (await GetCacheUserAsync(token)).FirstOrDefault(u => u.Id == id); if (user is null) - return 0; + throw new ArgumentInvalidException + ($"Invalid id {id}. You can't edit this user.", nameof(id)); var query = dbContext .Users .Where(u => u.Id == id);