@@ -385,51 +385,77 @@ func (api *API) templateVersionsByTemplate(rw http.ResponseWriter, r *http.Reque
385385 return
386386 }
387387
388- apiVersion := []codersdk. TemplateVersion {}
389- versions , err := api . Database . GetTemplateVersionsByTemplateID ( r . Context (), database. GetTemplateVersionsByTemplateIDParams {
390- TemplateID : template . ID ,
391- AfterID : paginationParams .AfterID ,
392- LimitOpt : int32 ( paginationParams . Limit ),
393- OffsetOpt : int32 ( paginationParams . Offset ),
394- } )
395- if errors .Is (err , sql .ErrNoRows ) {
396- httpapi .Write (rw , http .StatusOK , apiVersion )
397- return
398- }
399- if err != nil {
400- httpapi . Write ( rw , http . StatusInternalServerError , httpapi. Response {
401- Message : fmt . Sprintf ( "get template version: %s" , err ),
402- })
403- return
404- }
405- jobIDs := make ([]uuid. UUID , 0 , len ( versions ))
406- for _ , version := range versions {
407- jobIDs = append ( jobIDs , version . JobID )
408- }
409- jobs , err := api . Database . GetProvisionerJobsByIDs ( r . Context (), jobIDs )
410- if err != nil {
411- httpapi . Write ( rw , http . StatusInternalServerError , httpapi. Response {
412- Message : fmt . Sprintf ( "get jobs: %s" , err ),
388+ var err error
389+ apiVersions := []codersdk. TemplateVersion {}
390+ err = api . Database . InTx ( func ( store database. Store ) error {
391+ if paginationParams .AfterID != uuid . Nil {
392+ // See if the record exists first. If the record does not exist, the pagination
393+ // query will not work.
394+ _ , err := store . GetTemplateVersionByID ( r . Context (), paginationParams . AfterID )
395+ if err != nil && xerrors .Is (err , sql .ErrNoRows ) {
396+ httpapi .Write (rw , http .StatusBadRequest , httpapi. Response {
397+ Message : fmt . Sprintf ( "record at \" after_id \" (%q) does not exists" , paginationParams . AfterID . String ()),
398+ })
399+ return err
400+ } else if err != nil {
401+ httpapi . Write ( rw , http . StatusInternalServerError , httpapi. Response {
402+ Message : fmt . Sprintf ( "get template version at after_id: %s" , err ),
403+ })
404+ return err
405+ }
406+ }
407+
408+ versions , err := store . GetTemplateVersionsByTemplateID ( r . Context (), database. GetTemplateVersionsByTemplateIDParams {
409+ TemplateID : template . ID ,
410+ AfterID : paginationParams . AfterID ,
411+ LimitOpt : int32 ( paginationParams . Limit ),
412+ OffsetOpt : int32 ( paginationParams . Offset ),
413413 })
414- return
415- }
416- jobByID := map [string ]database.ProvisionerJob {}
417- for _ , job := range jobs {
418- jobByID [job .ID .String ()] = job
419- }
414+ if errors .Is (err , sql .ErrNoRows ) {
415+ httpapi .Write (rw , http .StatusOK , apiVersions )
416+ return err
417+ }
418+ if err != nil {
419+ httpapi .Write (rw , http .StatusInternalServerError , httpapi.Response {
420+ Message : fmt .Sprintf ("get template version: %s" , err ),
421+ })
422+ return err
423+ }
420424
421- for _ , version := range versions {
422- job , exists := jobByID [version .JobID .String ()]
423- if ! exists {
425+ jobIDs := make ([]uuid.UUID , 0 , len (versions ))
426+ for _ , version := range versions {
427+ jobIDs = append (jobIDs , version .JobID )
428+ }
429+ jobs , err := store .GetProvisionerJobsByIDs (r .Context (), jobIDs )
430+ if err != nil {
424431 httpapi .Write (rw , http .StatusInternalServerError , httpapi.Response {
425- Message : fmt .Sprintf ("job %q doesn't exist for version %q " , version . JobID , version . ID ),
432+ Message : fmt .Sprintf ("get jobs: %s " , err ),
426433 })
427- return
434+ return err
428435 }
429- apiVersion = append (apiVersion , convertTemplateVersion (version , convertProvisionerJob (job )))
436+ jobByID := map [string ]database.ProvisionerJob {}
437+ for _ , job := range jobs {
438+ jobByID [job .ID .String ()] = job
439+ }
440+
441+ for _ , version := range versions {
442+ job , exists := jobByID [version .JobID .String ()]
443+ if ! exists {
444+ httpapi .Write (rw , http .StatusInternalServerError , httpapi.Response {
445+ Message : fmt .Sprintf ("job %q doesn't exist for version %q" , version .JobID , version .ID ),
446+ })
447+ return err
448+ }
449+ apiVersions = append (apiVersions , convertTemplateVersion (version , convertProvisionerJob (job )))
450+ }
451+
452+ return nil
453+ })
454+ if err != nil {
455+ return
430456 }
431457
432- httpapi .Write (rw , http .StatusOK , apiVersion )
458+ httpapi .Write (rw , http .StatusOK , apiVersions )
433459}
434460
435461func (api * API ) templateVersionByName (rw http.ResponseWriter , r * http.Request ) {
@@ -582,7 +608,7 @@ func (api *API) postTemplateVersionsByOrganization(rw http.ResponseWriter, r *ht
582608 }
583609 }
584610
585- provisionerJob , err = api . Database .InsertProvisionerJob (r .Context (), database.InsertProvisionerJobParams {
611+ provisionerJob , err = db .InsertProvisionerJob (r .Context (), database.InsertProvisionerJobParams {
586612 ID : jobID ,
587613 CreatedAt : database .Now (),
588614 UpdatedAt : database .Now (),
@@ -606,7 +632,7 @@ func (api *API) postTemplateVersionsByOrganization(rw http.ResponseWriter, r *ht
606632 }
607633 }
608634
609- templateVersion , err = api . Database .InsertTemplateVersion (r .Context (), database.InsertTemplateVersionParams {
635+ templateVersion , err = db .InsertTemplateVersion (r .Context (), database.InsertTemplateVersionParams {
610636 ID : uuid .New (),
611637 TemplateID : templateID ,
612638 OrganizationID : organization .ID ,
0 commit comments