@@ -174,10 +174,10 @@ export class SpacePermissionsMiddleware extends BaseMiddleware implements Middle
174174 const permissions = this . permissionsBySpace [ space ] ?. [ account . uuid ] ?? [ ]
175175 let withoutMatch : Permission | undefined
176176 for ( const permission of permissions ) {
177- if ( permission . txClass === undefined || permission . txClass !== tx . _class ) continue
177+ if ( ! isTxClassMatched ( tx , permission ) ) continue
178178 if (
179179 permission . objectClass !== undefined &&
180- ! this . context . hierarchy . isDerived ( tx . objectClass , permission . objectClass )
180+ ! this . context . hierarchy . isDerived ( getTxObjectClass ( tx ) , permission . objectClass )
181181 ) {
182182 continue
183183 }
@@ -203,12 +203,13 @@ export class SpacePermissionsMiddleware extends BaseMiddleware implements Middle
203203
204204 if ( this . restrictedSpaces . has ( space ) ) {
205205 const attachedDocAncestors = this . context . hierarchy . getAncestors ( core . class . AttachedDoc )
206- const ancestors = this . context . hierarchy . getAncestors ( tx . objectClass )
206+ const ancestors = this . context . hierarchy . getAncestors ( getTxObjectClass ( tx ) )
207207 const targetAncestors = ancestors . filter ( ( a ) => ! attachedDocAncestors . includes ( a ) )
208+ const txClass = getTxClass ( tx )
208209
209210 const permissions = this . context . modelDb . findAllSync ( core . class . Permission , {
210211 objectClass : { $in : targetAncestors } ,
211- txClass : tx . _class
212+ txClass
212213 } )
213214 const matched = permissions . filter ( ( p ) => {
214215 if ( p . txMatch === undefined ) return false
@@ -460,3 +461,20 @@ export class SpacePermissionsMiddleware extends BaseMiddleware implements Middle
460461 }
461462 }
462463}
464+
465+ function getTxClass ( tx : Tx ) : Ref < Class < Tx > > {
466+ let _class = tx . _class
467+ if ( tx . _class === core . class . TxMixin && Object . keys ( ( tx as TxMixin < Doc , Doc > ) . attributes ) . length > 0 ) {
468+ _class = core . class . TxUpdateDoc
469+ }
470+ return _class
471+ }
472+
473+ function isTxClassMatched ( tx : Tx , permission : Permission ) : boolean {
474+ const txClass = getTxClass ( tx )
475+ return permission . txClass === txClass
476+ }
477+
478+ function getTxObjectClass ( tx : TxCUD < Doc > ) : Ref < Class < Doc > > {
479+ return tx . _class === core . class . TxMixin ? ( tx as TxMixin < Doc , Doc > ) . mixin : tx . objectClass
480+ }
0 commit comments