@@ -177,6 +177,13 @@ export class GitHubRepository extends Disposable {
177177 value . model . dispose ( ) ;
178178 }
179179 } ) ;
180+ private _issueModelsByNumber : LRUCache < number , { model : IssueModel , disposables : vscode . Disposable [ ] } > = new LRUCache ( {
181+ maxAge : 1000 * 60 * 60 * 4 /* 4 hours */ , stale : true , updateAgeOnGet : true ,
182+ dispose : ( _key , value ) => {
183+ disposeAll ( value . disposables ) ;
184+ value . model . dispose ( ) ;
185+ }
186+ } ) ;
180187 // eslint-disable-next-line rulesdir/no-any-except-union-method-signature
181188 private _queriesSchema : any ;
182189 private _areQueriesLimited : boolean = false ;
@@ -206,10 +213,18 @@ export class GitHubRepository extends Disposable {
206213 return this . _pullRequestModelsByNumber . get ( prNumber ) ?. model ;
207214 }
208215
216+ getExistingIssueModel ( issueNumber : number ) : IssueModel | undefined {
217+ return this . _issueModelsByNumber . get ( issueNumber ) ?. model ;
218+ }
219+
209220 get pullRequestModels ( ) : PullRequestModel [ ] {
210221 return Array . from ( this . _pullRequestModelsByNumber . values ( ) . map ( value => value . model ) ) ;
211222 }
212223
224+ get issueModels ( ) : IssueModel [ ] {
225+ return Array . from ( this . _issueModelsByNumber . values ( ) . map ( value => value . model ) ) ;
226+ }
227+
213228 public async ensureCommentsController ( ) : Promise < void > {
214229 try {
215230 if ( this . commentsController ) {
@@ -1009,6 +1024,19 @@ export class GitHubRepository extends Disposable {
10091024 return model ;
10101025 }
10111026
1027+ private createOrUpdateIssueModel ( issue : Issue ) : IssueModel {
1028+ let model = this . _issueModelsByNumber . get ( issue . number ) ?. model ;
1029+ if ( model ) {
1030+ model . update ( issue ) ;
1031+ } else {
1032+ model = new IssueModel ( this . telemetry , this , this . remote , issue ) ;
1033+ // No issue-specific event emitters yet; store empty disposables list for symmetry/cleanup
1034+ const disposables : vscode . Disposable [ ] = [ ] ;
1035+ this . _issueModelsByNumber . set ( issue . number , { model, disposables } ) ;
1036+ }
1037+ return model ;
1038+ }
1039+
10121040 private _onPullRequestModelChanged ( model : PullRequestModel , change : IssueChangeEvent ) : void {
10131041 this . _onDidChangePullRequests . fire ( [ { model, event : change } ] ) ;
10141042 }
@@ -1094,14 +1122,23 @@ export class GitHubRepository extends Disposable {
10941122 }
10951123
10961124 Logger . debug ( `Fetch pull request ${ id } - done` , this . id ) ;
1097- return this . createOrUpdatePullRequestModel ( await parseGraphQLPullRequest ( data . repository . pullRequest , this ) ) ;
1125+ const pr = this . createOrUpdatePullRequestModel ( await parseGraphQLPullRequest ( data . repository . pullRequest , this ) ) ;
1126+ await pr . getLastUpdateTime ( new Date ( pr . item . updatedAt ) ) ;
1127+ return pr ;
10981128 } catch ( e ) {
10991129 Logger . error ( `Unable to fetch PR: ${ e } ` , this . id ) ;
11001130 return ;
11011131 }
11021132 }
11031133
1104- async getIssue ( id : number , withComments : boolean = false ) : Promise < IssueModel | undefined > {
1134+ async getIssue ( id : number , withComments : boolean = false , useCache : boolean = false ) : Promise < IssueModel | undefined > {
1135+ if ( useCache ) {
1136+ const cached = this . _issueModelsByNumber . get ( id ) ?. model ;
1137+ if ( cached ) {
1138+ Logger . debug ( `Using cached issue model for ${ id } ` , this . id ) ;
1139+ return cached ;
1140+ }
1141+ }
11051142 try {
11061143 Logger . debug ( `Fetch issue ${ id } - enter` , this . id ) ;
11071144 const { query, remote, schema } = await this . ensure ( ) ;
@@ -1121,7 +1158,9 @@ export class GitHubRepository extends Disposable {
11211158 }
11221159 Logger . debug ( `Fetch issue ${ id } - done` , this . id ) ;
11231160
1124- return new IssueModel ( this . telemetry , this , remote , await parseGraphQLIssue ( data . repository . issue , this ) ) ;
1161+ const issue = this . createOrUpdateIssueModel ( await parseGraphQLIssue ( data . repository . issue , this ) ) ;
1162+ await issue . getLastUpdateTime ( new Date ( issue . item . updatedAt ) ) ;
1163+ return issue ;
11251164 } catch ( e ) {
11261165 Logger . error ( `Unable to fetch issue: ${ e } ` , this . id ) ;
11271166 return ;
0 commit comments