11import Model , { attr , hasMany } from '@ember-data/model' ;
2+ import { assert } from '@ember/debug' ;
23import { waitForPromise } from '@ember/test-waiters' ;
34import { cached } from '@glimmer/tracking' ;
45
56import { apiAction } from '@mainmatter/ember-api-actions' ;
7+ import { task } from 'ember-concurrency' ;
68
79export default class Crate extends Model {
810 @attr name ;
@@ -35,22 +37,34 @@ export default class Crate extends Model {
3537 @hasMany ( 'dependency' , { async : true , inverse : null } ) reverse_dependencies ;
3638
3739 @cached get versionIdsBySemver ( ) {
38- let versions = this . versions . toArray ( ) ?? [ ] ;
39- return versions . sort ( compareVersionBySemver ) . map ( v => v . id ) ;
40+ let { last } = this . loadVersionsTask ;
41+ assert ( '`loadVersionsTask.perform()` must be called before calling `versionIdsBySemver`' , last != null ) ;
42+ let versions = last ?. value ?? [ ] ;
43+ return versions
44+ . slice ( )
45+ . sort ( compareVersionBySemver )
46+ . map ( v => v . id ) ;
4047 }
4148
4249 @cached get versionIdsByDate ( ) {
43- let versions = this . versions . toArray ( ) ?? [ ] ;
44- return versions . sort ( compareVersionByDate ) . map ( v => v . id ) ;
50+ let { last } = this . loadVersionsTask ;
51+ assert ( '`loadVersionsTask.perform()` must be called before calling `versionIdsByDate`' , last != null ) ;
52+ let versions = last ?. value ?? [ ] ;
53+ return versions
54+ . slice ( )
55+ . sort ( compareVersionByDate )
56+ . map ( v => v . id ) ;
4557 }
4658
4759 @cached get firstVersionId ( ) {
4860 return this . versionIdsByDate . at ( - 1 ) ;
4961 }
5062
5163 @cached get versionsObj ( ) {
52- let versions = this . versions . toArray ( ) ?? [ ] ;
53- return Object . fromEntries ( versions . map ( v => [ v . id , v ] ) ) ;
64+ let { last } = this . loadVersionsTask ;
65+ assert ( '`loadVersionsTask.perform()` must be called before calling `versionsObj`' , last != null ) ;
66+ let versions = last ?. value ?? [ ] ;
67+ return Object . fromEntries ( versions . slice ( ) . map ( v => [ v . id , v ] ) ) ;
5468 }
5569
5670 @cached get releaseTrackSet ( ) {
@@ -65,10 +79,16 @@ export default class Crate extends Model {
6579 return new Set ( map . values ( ) ) ;
6680 }
6781
82+ hasOwnerUser ( userId ) {
83+ let { last } = this . loadOwnerUserTask ;
84+ assert ( '`loadOwnerUserTask.perform()` must be called before calling `hasOwnerUser()`' , last != null ) ;
85+ return ( last ?. value ?? [ ] ) . some ( ( { id } ) => id === userId ) ;
86+ }
87+
6888 get owners ( ) {
69- let teams = this . owner_team . toArray ( ) ?? [ ] ;
70- let users = this . owner_user . toArray ( ) ?? [ ] ;
71- return [ ... teams , ... users ] ;
89+ let { last } = this . loadOwnersTask ;
90+ assert ( '`loadOwnersTask.perform()` must be called before accessing `owners`' , last != null ) ;
91+ return last ?. value ?? [ ] ;
7292 }
7393
7494 async follow ( ) {
@@ -100,6 +120,19 @@ export default class Crate extends Model {
100120 throw response ;
101121 }
102122 }
123+
124+ loadOwnerUserTask = task ( async ( ) => {
125+ return ( await this . owner_user ) ?? [ ] ;
126+ } ) ;
127+
128+ loadOwnersTask = task ( async ( ) => {
129+ let [ teams , users ] = await Promise . all ( [ this . owner_team , this . owner_user ] ) ;
130+ return [ ...( teams ?? [ ] ) , ...( users ?? [ ] ) ] ;
131+ } ) ;
132+
133+ loadVersionsTask = task ( async ( ) => {
134+ return ( await this . versions ) ?? [ ] ;
135+ } ) ;
103136}
104137
105138function compareVersionBySemver ( a , b ) {
0 commit comments