Skip to content

Commit

Permalink
Adds Catalog Next Swagger (Backport) (#318)
Browse files Browse the repository at this point in the history
* Adds Swagger for Catalog Next - Backport

* Fixes linting

* Fixes linting
  • Loading branch information
richmahn committed Mar 24, 2021
1 parent fb6c5f0 commit e0b0ca1
Show file tree
Hide file tree
Showing 23 changed files with 2,382 additions and 465 deletions.
14 changes: 13 additions & 1 deletion Makefile
Expand Up @@ -127,6 +127,13 @@ SWAGGER_SPEC_S_TMPL := s|"basePath": *"/api/v1"|"basePath": "{{AppSubUrl}}/api/v
SWAGGER_SPEC_S_JSON := s|"basePath": *"{{AppSubUrl}}/api/v1"|"basePath": "/api/v1"|g
SWAGGER_EXCLUDE := code.gitea.io/sdk
SWAGGER_NEWLINE_COMMAND := -e '$$a\'
# DCS Customizations
SWAGGER_CATALOG_SPEC := templates/swagger/catalog/catalog_json.tmpl
SWAGGER_CATALOG_SPEC_S_TMPL := s|"basePath": *"/api/catalog"|"basePath": "{{AppSubUrl}}/api/catalog"|g
SWAGGER_CATALOG_SPEC_S_JSON := s|"basePath": *"{{AppSubUrl}}/api/catalog"|"basePath": "/api/catalog"|g
SWAGGER_CATALOG_EXCLUDE := code.gitea.io/sdk" -x "code.gitea.io/gitea/routers/api/v1
SWAGGER_EXCLUDE := code.gitea.io/sdk" -x "code.gitea.io/gitea/routers/api/catalog
# END DCS Customizations

TEST_MYSQL_HOST ?= mysql:3306
TEST_MYSQL_DBNAME ?= testgitea
Expand Down Expand Up @@ -230,7 +237,7 @@ vet:
# Default vet
$(GO) vet $(GO_PACKAGES)
# Custom vet
$(GO) build -mod=vendor gitea.com/unfoldingword/gitea-vet
$(GO) build -mod=vendor gitea.com/unfoldingword/gitea-vet
$(GO) vet -vettool=gitea-vet $(GO_PACKAGES)

.PHONY: $(TAGS_EVIDENCE)
Expand All @@ -247,6 +254,11 @@ generate-swagger:
$(SWAGGER) generate spec -x "$(SWAGGER_EXCLUDE)" -o './$(SWAGGER_SPEC)'
$(SED_INPLACE) '$(SWAGGER_SPEC_S_TMPL)' './$(SWAGGER_SPEC)'
$(SED_INPLACE) $(SWAGGER_NEWLINE_COMMAND) './$(SWAGGER_SPEC)'
# DCS Customizations
$(SWAGGER) generate spec -x "$(SWAGGER_CATALOG_EXCLUDE)" -o './$(SWAGGER_CATALOG_SPEC)'
$(SED_INPLACE) '$(SWAGGER_CATALOG_SPEC_S_TMPL)' './$(SWAGGER_CATALOG_SPEC)'
$(SED_INPLACE) $(SWAGGER_NEWLINE_COMMAND) './$(SWAGGER_CATALOG_SPEC)'
# END DCS Customizaitons

.PHONY: swagger-check
swagger-check: generate-swagger
Expand Down
67 changes: 50 additions & 17 deletions models/door43metadata.go
Expand Up @@ -7,6 +7,7 @@ package models
import (
"fmt"
"sort"
"time"

"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
Expand All @@ -33,41 +34,43 @@ type Door43Metadata struct {
UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
}

// GetRepo gets the repo associated with the door43 metadata entry
func (dm *Door43Metadata) GetRepo() error {
return dm.getRepo(x)
}

func (dm *Door43Metadata) getRepo(e Engine) error {
if dm.Repo == nil {
if repo, err := GetRepositoryByID(dm.RepoID); err != nil {
repo, err := GetRepositoryByID(dm.RepoID)
if err != nil {
return err
}
dm.Repo = repo
if err := dm.Repo.getOwner(e); err != nil {
return err
} else {
dm.Repo = repo
if err := dm.Repo.getOwner(e); err != nil {
return nil
}
}
}
return nil
}

// GetRelease gets the associated release of a door43 metadata entry
func (dm *Door43Metadata) GetRelease() error {
return dm.getRelease(x)
}

func (dm *Door43Metadata) getRelease(e Engine) error {
if dm.ReleaseID > 0 && dm.Release == nil {
if rel, err := GetReleaseByID(dm.ReleaseID); err != nil {
rel, err := GetReleaseByID(dm.ReleaseID)
if err != nil {
return err
} else {
dm.Release = rel
dm.Release.Door43Metadata = dm
if err := dm.getRepo(e); err != nil {
return err
}
dm.Release.Repo = dm.Repo
return dm.Release.loadAttributes(e)
}
dm.Release = rel
dm.Release.Door43Metadata = dm
if err := dm.getRepo(e); err != nil {
return err
}
dm.Release.Repo = dm.Repo
return dm.Release.loadAttributes(e)
}
return nil
}
Expand All @@ -77,7 +80,7 @@ func (dm *Door43Metadata) loadAttributes(e Engine) error {
return err
}
if dm.Release == nil && dm.ReleaseID > 0 {
if err := dm.getRelease(e); err !=nil {
if err := dm.getRelease(e); err != nil {
return nil
}
}
Expand Down Expand Up @@ -145,7 +148,12 @@ func (dm *Door43Metadata) GetZipballURL() string {
// GetReleaseURL get the URL the release API
func (dm *Door43Metadata) GetReleaseURL() string {
if dm.ReleaseID > 0 {
return dm.Release.APIURL()
if dm.Release != nil {
return dm.Release.APIURL()
}
if err := dm.GetRepo(); err == nil {
return fmt.Sprintf("%sapi/v1/repos/%s/releases/%d", setting.AppURL, dm.Repo.FullName(), dm.ReleaseID)
}
}
return ""
}
Expand Down Expand Up @@ -342,6 +350,11 @@ func (dm *Door43Metadata) GetReleaseCount() (int64, error) {
Count(&Door43Metadata{})
}

// GetReleaseDateTime returns the ReleaseDateUnix time stamp as a RFC3339 date, e.g. 2006-01-02T15:04:05Z07:00
func (dm *Door43Metadata) GetReleaseDateTime() string {
return dm.ReleaseDateUnix.Format(time.RFC3339)
}

// GetDoor43MetadataByRepoIDAndReleaseID returns the metadata of a given release ID (0 = default branch).
func GetDoor43MetadataByRepoIDAndReleaseID(repoID, releaseID int64) (*Door43Metadata, error) {
return getDoor43MetadataByRepoIDAndReleaseID(x, repoID, releaseID)
Expand All @@ -359,6 +372,26 @@ func getDoor43MetadataByRepoIDAndReleaseID(e Engine, repoID, releaseID int64) (*
return dm, err
}

// GetDoor43MetadataByRepoIDAndStage returns the metadata of a given repo ID and stage.
func GetDoor43MetadataByRepoIDAndStage(repoID int64, stage Stage) (*Door43Metadata, error) {
return getDoor43MetadataByRepoIDAndStage(x, repoID, stage)
}

func getDoor43MetadataByRepoIDAndStage(e Engine, repoID int64, stage Stage) (*Door43Metadata, error) {
var cond = builder.NewCond().
And(builder.Eq{"repo_id": repoID}).
And(builder.Eq{"stage": stage})
e = e.Where(cond)
e.Desc("created_unix")

dm := &Door43Metadata{}
found, err := e.Get(dm)
if err != nil || !found {
return nil, err
}
return dm, err
}

type door43MetadataSorter struct {
dms []*Door43Metadata
}
Expand Down
70 changes: 70 additions & 0 deletions models/repo.go
Expand Up @@ -410,6 +410,75 @@ func (repo *Repository) innerAPIFormat(e Engine, mode AccessMode, isParent bool)
numReleases, _ := GetReleaseCountByRepoID(repo.ID, FindReleasesOptions{IncludeDrafts: false, IncludeTags: true})

/* DCS Customizations */
catalog := &api.CatalogStages{}
prod, err := GetDoor43MetadataByRepoIDAndStage(repo.ID, StageProd)
if err != nil {
log.Error("GetDoor43MetadataByRepoIDAndStage: %v", err)
}
preprod, err := GetDoor43MetadataByRepoIDAndStage(repo.ID, StagePreProd)
if err != nil {
log.Error("GetDoor43MetadataByRepoIDAndStage: %v", err)
}
draft, err := GetDoor43MetadataByRepoIDAndStage(repo.ID, StageDraft)
if err != nil {
log.Error("GetDoor43MetadataByRepoIDAndStage: %v", err)
}
latest, err := GetDoor43MetadataByRepoIDAndStage(repo.ID, StageLatest)
if err != nil {
log.Error("GetDoor43MetadataByRepoIDAndStage: %v", err)
}

if draft != nil && ((prod != nil && prod.ReleaseDateUnix >= draft.ReleaseDateUnix) ||
(preprod != nil && preprod.ReleaseDateUnix >= draft.ReleaseDateUnix)) {
draft = nil
}
if prod != nil && preprod != nil && prod.ReleaseDateUnix >= preprod.ReleaseDateUnix {
preprod = nil
}
if prod != nil {
prod.Repo = repo
url := prod.GetReleaseURL()
catalog.Production = &api.CatalogStage{
Tag: prod.BranchOrTag,
ReleaseURL: &url,
Released: prod.GetReleaseDateTime(),
ZipballURL: prod.GetZipballURL(),
TarballURL: prod.GetTarballURL(),
}
}
if preprod != nil {
preprod.Repo = repo
url := preprod.GetReleaseURL()
catalog.PreProduction = &api.CatalogStage{
Tag: preprod.BranchOrTag,
ReleaseURL: &url,
Released: preprod.GetReleaseDateTime(),
ZipballURL: preprod.GetZipballURL(),
TarballURL: preprod.GetTarballURL(),
}
}
if draft != nil {
draft.Repo = repo
url := draft.GetReleaseURL()
catalog.Draft = &api.CatalogStage{
Tag: draft.BranchOrTag,
ReleaseURL: &url,
Released: draft.GetReleaseDateTime(),
ZipballURL: draft.GetZipballURL(),
TarballURL: draft.GetTarballURL(),
}
}
if latest != nil {
latest.Repo = repo
catalog.Latest = &api.CatalogStage{
Tag: latest.BranchOrTag,
ReleaseURL: nil,
Released: latest.GetReleaseDateTime(),
ZipballURL: latest.GetZipballURL(),
TarballURL: latest.GetTarballURL(),
}
}

metadata, err := getDoor43MetadataByRepoIDAndReleaseID(e, repo.ID, 0)
if err != nil && !IsErrDoor43MetadataNotExist(err) {
log.Error("getDoor43MetadataByRepoIDAndReleaseID: %v", err)
Expand Down Expand Up @@ -480,6 +549,7 @@ func (repo *Repository) innerAPIFormat(e Engine, mode AccessMode, isParent bool)
Subject: subject,
Books: books,
CheckingLevel: checkingLevel,
Catalog: catalog,
}
}

Expand Down
12 changes: 6 additions & 6 deletions modules/convert/door43metadata.go
Expand Up @@ -44,7 +44,7 @@ func ToDoor43MetadataV4(dm *models.Door43Metadata, mode models.AccessMode) *api.
// ToDoor43MetadataV5 converts a Door43Metadata to api.Door43Metadata for Catalog V5
func ToDoor43MetadataV5(dm *models.Door43Metadata, mode models.AccessMode) *api.Door43MetadataV5 {
if err := dm.LoadAttributes(); err != nil {
return nil
return nil
}

if err := dm.Repo.GetOwner(); err != nil {
Expand All @@ -59,11 +59,11 @@ func ToDoor43MetadataV5(dm *models.Door43Metadata, mode models.AccessMode) *api.
return &api.Door43MetadataV5{
ID: dm.ID,
Self: dm.APIURLV5(),
Name: dm.Repo.Name,
Owner: dm.Repo.OwnerName,
FullName: dm.Repo.FullName(),
Name: dm.Repo.Name,
Owner: dm.Repo.OwnerName,
FullName: dm.Repo.FullName(),
Repo: dm.Repo.APIFormat(mode),
Release: release,
Release: release,
TarballURL: dm.GetTarballURL(),
ZipballURL: dm.GetZipballURL(),
Language: (*dm.Metadata)["dublin_core"].(map[string]interface{})["language"].(map[string]interface{})["identifier"].(string),
Expand All @@ -72,7 +72,7 @@ func ToDoor43MetadataV5(dm *models.Door43Metadata, mode models.AccessMode) *api.
Books: dm.GetBooks(),
BranchOrTag: dm.BranchOrTag,
Stage: dm.Stage.String(),
Released: dm.ReleaseDateUnix.FormatDate(),
Released: dm.GetReleaseDateTime(),
MetadataVersion: dm.MetadataVersion,
MetadataURL: dm.GetMetadataURL(),
MetadataJSONURL: dm.GetMetadataJSONURL(),
Expand Down
37 changes: 33 additions & 4 deletions modules/structs/door43metadata.go
Expand Up @@ -32,11 +32,11 @@ type Door43MetadataV4 struct {
type Door43MetadataV5 struct {
ID int64 `json:"id"`
Self string `json:"url"`
Name string `json:"name"`
Owner string `json:"owner"`
FullName string `json:"full_name"`
Name string `json:"name"`
Owner string `json:"owner"`
FullName string `json:"full_name"`
Repo *Repository `json:"repo"`
Release *Release `json:"release"`
Release *Release `json:"release"`
TarballURL string `json:"tarbar_url"`
ZipballURL string `json:"zipball_url"`
Language string `json:"language"`
Expand Down Expand Up @@ -64,3 +64,32 @@ type CatalogSearchResultsV5 struct {
OK bool `json:"ok"`
Data []*Door43MetadataV5 `json:"data"`
}

// CatalogVersionEndpoints Info on the versions of the catalog
type CatalogVersionEndpoints struct {
Latest string `json:"latest"`
Versions map[string]string `json:"versions"`
}

// CatalogVersionEndpointsResponse response with the endpoints for all versions of the catalog
type CatalogVersionEndpointsResponse struct {
OK bool `json:"ok"`
Data []*CatalogVersionEndpoints `json:"data"`
}

// CatalogStages a repo's catalog stages
type CatalogStages struct {
Production *CatalogStage `json:"prod"`
PreProduction *CatalogStage `json:"preprod"`
Draft *CatalogStage `json:"draft"`
Latest *CatalogStage `json:"latest"`
}

// CatalogStage a repo's catalog stage metadata
type CatalogStage struct {
Tag string `json:"branch_or_tag_name"`
ReleaseURL *string `json:"release_url"`
Released string `json:"released"`
ZipballURL string `json:"zipball_url"`
TarballURL string `json:"tarball_url"`
}
1 change: 1 addition & 0 deletions modules/structs/repo.go
Expand Up @@ -96,6 +96,7 @@ type Repository struct {
Books []string `json:"books"`
Title string `json:"title"`
CheckingLevel string `json:"checking_level"`
Catalog *CatalogStages `json:"catalog"`
}

// CreateRepoOption options when creating repository
Expand Down
7 changes: 6 additions & 1 deletion options/schema/rc.schema.json
Expand Up @@ -255,7 +255,12 @@
"TSV Study Questions",
"TSV Translation Notes",
"TSV Translation Questions",
"TSV Translation Words Links"
"TSV Translation Words Links",
"TSV OBS Study Notes",
"TSV OBS Study Questions",
"TSV OBS Translation Notes",
"TSV OBS Translation Questions",
"TSV OBS Translation Words Links"
]
},
"title": {
Expand Down

0 comments on commit e0b0ca1

Please sign in to comment.