@@ -55,14 +55,13 @@ await db.ExecuteAsync(
5555 public async Task < IEnumerable < MailBox > > GetBoxes ( bool showAll = false )
5656 {
5757 var currentUserId = _userService . GetUserId ( ) ;
58- var role = _userService . GetRole ( ) ;
59- var isAdmin = role == "Admin" ;
58+ var isAdmin = _userService . IsAdmin ( ) ;
59+ var userSubdomain = _userService . GetSubdomain ( ) ;
6060
6161 using var db = await _db . GetConnectionAsync ( ) ;
6262
63- // Get distinct mailboxes with their mail group info using a simpler approach
6463 string sql ;
65- if ( isAdmin && showAll )
64+ if ( isAdmin )
6665 {
6766 sql = @"SELECT DISTINCT m.`To`, m.MailGroupPath, mg.Subdomain, mg.IsPublic, mg.OwnerUserId
6867 FROM Mail m
@@ -73,12 +72,12 @@ FROM Mail m
7372 sql = @"SELECT DISTINCT m.`To`, m.MailGroupPath, mg.Subdomain, mg.IsPublic, mg.OwnerUserId
7473 FROM Mail m
7574 LEFT JOIN MailGroup mg ON m.MailGroupPath = mg.Path
76- WHERE (mg.IsPublic = 1 OR mg.OwnerUserId = @UserId
77- OR EXISTS (SELECT 1 FROM MailGroupUser mgu WHERE mgu.MailGroupId = mg.Id AND mgu.UserId = @UserId))
78- OR ( mg.Id IS NULL AND @IsAdmin = 1 )" ;
75+ WHERE mg.OwnerUserId = @UserId
76+ OR mg.Subdomain = @UserSubdomain
77+ OR EXISTS (SELECT 1 FROM MailGroupUser mgu WHERE mgu.MailGroupId = mg.Id AND mgu.UserId = @UserId )" ;
7978 }
8079
81- var mailboxes = await db . QueryAsync < dynamic > ( sql , new { UserId = currentUserId , IsAdmin = isAdmin } ) ;
80+ var mailboxes = await db . QueryAsync < dynamic > ( sql , new { UserId = currentUserId , UserSubdomain = userSubdomain } ) ;
8281
8382 var result = new List < MailBox > ( ) ;
8483 foreach ( var mailbox in mailboxes )
@@ -109,8 +108,8 @@ AND NOT EXISTS (SELECT 1 FROM UserMailRead umr WHERE umr.MailId = m.Id AND umr.U
109108 public async Task < PagedResults < MailWithReadStatus > > GetMails ( [ FromBody ( EmptyBodyBehavior = EmptyBodyBehavior . Allow ) ] FilterOptions ? options = null )
110109 {
111110 var currentUserId = _userService . GetUserId ( ) ;
112- var role = _userService . GetRole ( ) ;
113- var isAdmin = role == "Admin" ;
111+ var isAdmin = _userService . IsAdmin ( ) ;
112+ var userSubdomain = _userService . GetSubdomain ( ) ;
114113
115114 var results = new PagedResults < MailWithReadStatus > ( ) ;
116115 options ??= new FilterOptions ( ) ;
@@ -120,21 +119,19 @@ public async Task<PagedResults<MailWithReadStatus>> GetMails([FromBody(EmptyBody
120119 var whereClauses = new List < string > ( ) ;
121120 var parameters = new DynamicParameters ( ) ;
122121 parameters . Add ( "UserId" , currentUserId ) ;
123- parameters . Add ( "IsAdmin " , isAdmin ) ;
122+ parameters . Add ( "UserSubdomain " , userSubdomain ) ;
124123
125124 if ( ! string . IsNullOrEmpty ( options . To ) )
126125 {
127126 whereClauses . Add ( "m.`To` = @To" ) ;
128127 parameters . Add ( "To" , options . To ) ;
129128 }
130129
131- // Filter by mail group access - user must have access to the mail group
132- // Admins can see all, others can only see emails in groups they have access to
133130 if ( ! isAdmin )
134131 {
135132 whereClauses . Add ( @"(
136- mg.IsPublic = 1
137- OR mg.OwnerUserId = @UserId
133+ mg.OwnerUserId = @UserId
134+ OR mg.Subdomain = @UserSubdomain
138135 OR EXISTS (SELECT 1 FROM MailGroupUser mgu WHERE mgu.MailGroupId = mg.Id AND mgu.UserId = @UserId)
139136 )" ) ;
140137 }
@@ -150,7 +147,7 @@ OR EXISTS (SELECT 1 FROM MailGroupUser mgu WHERE mgu.MailGroupId = mg.Id AND mgu
150147 var offset = ( options . Page - 1 ) * options . PageSize ;
151148 var mails = await db . QueryAsync < Mail > (
152149 $ "SELECT m.* FROM Mail m LEFT JOIN MailGroup mg ON m.MailGroupPath = mg.Path { whereClause } ORDER BY m.CreatedOn DESC LIMIT @Limit OFFSET @Offset",
153- new { Limit = options . PageSize , Offset = offset , To = options . To , UserId = currentUserId , IsAdmin = isAdmin } ) ;
150+ new { Limit = options . PageSize , Offset = offset , To = options . To , UserId = currentUserId , UserSubdomain = userSubdomain } ) ;
154151
155152 var mailList = mails . ToList ( ) ;
156153 var mailIds = mailList . Select ( m => m . Id ) . ToList ( ) ;
@@ -201,15 +198,28 @@ public async Task<IActionResult> DeleteBox([FromBody] FilterOptions options)
201198 public async Task < IActionResult > GetMailGroups ( )
202199 {
203200 var userId = _userService . GetUserId ( ) ;
201+ var isAdmin = _userService . IsAdmin ( ) ;
202+ var userSubdomain = _userService . GetSubdomain ( ) ;
204203 using var db = await _db . GetConnectionAsync ( ) ;
205204
206- var groups = await db . QueryAsync < dynamic > (
207- @"SELECT mg.Id, mg.Path, mg.Subdomain, mg.Description, mg.IsPublic, mg.CreatedAt, mg.LastActivity, mg.OwnerUserId, mg.IsUserPrivate
208- FROM MailGroup mg
209- WHERE mg.Subdomain IS NOT NULL AND mg.IsUserPrivate = 0
210- AND (mg.IsPublic = 1 OR mg.OwnerUserId = @UserId
211- OR EXISTS (SELECT 1 FROM MailGroupUser mgu WHERE mgu.MailGroupId = mg.Id AND mgu.UserId = @UserId))" ,
212- new { UserId = userId } ) ;
205+ string sql ;
206+ if ( isAdmin )
207+ {
208+ sql = @"SELECT mg.Id, mg.Path, mg.Subdomain, mg.Description, mg.IsPublic, mg.CreatedAt, mg.LastActivity, mg.OwnerUserId, mg.IsUserPrivate
209+ FROM MailGroup mg
210+ WHERE mg.Subdomain IS NOT NULL AND mg.IsUserPrivate = 0" ;
211+ }
212+ else
213+ {
214+ sql = @"SELECT mg.Id, mg.Path, mg.Subdomain, mg.Description, mg.IsPublic, mg.CreatedAt, mg.LastActivity, mg.OwnerUserId, mg.IsUserPrivate
215+ FROM MailGroup mg
216+ WHERE mg.Subdomain IS NOT NULL AND mg.IsUserPrivate = 0
217+ AND (mg.OwnerUserId = @UserId
218+ OR mg.Subdomain = @UserSubdomain
219+ OR EXISTS (SELECT 1 FROM MailGroupUser mgu WHERE mgu.MailGroupId = mg.Id AND mgu.UserId = @UserId))" ;
220+ }
221+
222+ var groups = await db . QueryAsync < dynamic > ( sql , new { UserId = userId , UserSubdomain = userSubdomain } ) ;
213223
214224 var result = groups . Select ( mg => new
215225 {
@@ -367,7 +377,8 @@ public async Task<IActionResult> GetUsers()
367377 u . Id ,
368378 u . UserName ,
369379 u . Role ,
370- u . TimeStamp
380+ u . TimeStamp ,
381+ u . Subdomain
371382 } ) . ToList ( ) ;
372383
373384 return Ok ( result ) ;
0 commit comments