code: func (r *GormWorkItemTypeRepository) ListPlannerItemTypes(ctx context.Context, spaceTemplateID uuid.UUID) ([]WorkItemType, error) {
  	defer goa.MeasureSince([]string{"goa", "db", "workitemtype", "listPlannerItemTypes"}, time.Now())
  
  	// check space template exists
  	if err := spacetemplate.NewRepository(r.db).CheckExists(ctx, spaceTemplateID); err != nil {
  		return nil, errors.NewNotFoundError("space template", spaceTemplateID.String())
  	}
  
  	var wits []WorkItemType
  	db := r.db.Select("id").Where("space_template_id = ? AND path::text LIKE '"+path.ConvertToLtree(SystemPlannerItem)+".%'", spaceTemplateID.String()).Order("created_at")
  	if err := db.Find(&wits).Error; err != nil {
  		log.Error(ctx, map[string]interface{}{
  			"space_template_id": spaceTemplateID,
  			"err":               err,
  		}, "unable to list the work item types that derive off of planner item type")
  		return nil, errs.WithStack(err)
  	}
  	for i, wit := range wits {
  		childTypes, err := r.loadChildTypeList(ctx, wit.ID)
  		if err != nil {
  			return nil, errs.Wrapf(err, `failed to load child types for WIT "%s" (%s)`, wit.Name, wit.ID)
  		}
  		wits[i].ChildTypeIDs = childTypes
  	}
  	return wits, nil
  
  }
docs: // ListPlannerItemTypes returns work item types that derives from PlannerItem type