diff --git a/models/repo.go b/models/repo.go index d01648c67f..d206143cb3 100644 --- a/models/repo.go +++ b/models/repo.go @@ -245,6 +245,10 @@ type Repository struct { // Avatar: ID(10-20)-md5(32) - must fit into 64 symbols Avatar string `xorm:"VARCHAR(64)"` + /*** DCS Customizations ***/ + Metadata *map[string]interface{} `xorm:-` + /*** DCS Customizations ***/ + CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` } diff --git a/models/user_dcs.go b/models/user_dcs.go index 183f6930ed..bd43063f4e 100644 --- a/models/user_dcs.go +++ b/models/user_dcs.go @@ -28,15 +28,17 @@ func (u *User) GetRepoLanguages() []string { log.Error("Error GetUserRepositories: %v", err) } else { for _, repo := range repos { + lang := dcs.GetLanguageFromRepoName(repo.LowerName) + if lang != "" && !contains(languages, lang) { + languages = append(languages, lang) + } if dm, err := repo.GetDefaultBranchMetadata(); err != nil { log.Error("Error GetDefaultBranchMetadata: %v", err) } else if dm != nil { - lang := (*dm.Metadata)["dublin_core"].(map[string]interface{})["language"].(map[string]interface{})["identifier"].(string) + lang = (*dm.Metadata)["dublin_core"].(map[string]interface{})["language"].(map[string]interface{})["identifier"].(string) if lang != "" && !contains(languages, lang) { languages = append(languages, lang) } - } else if lang := dcs.GetLanguageFromRepoName(repo.LowerName); lang != "" && !contains(languages, lang) { - languages = append(languages, lang) } } } diff --git a/modules/convert/repository.go b/modules/convert/repository.go index 6e1b693597..f59eba2fe7 100644 --- a/modules/convert/repository.go +++ b/modules/convert/repository.go @@ -95,84 +95,85 @@ func innerToRepo(repo *models.Repository, mode models.AccessMode, isParent bool) /*** DCS Customizations ***/ catalog := &api.CatalogStages{} - prod, err := models.GetDoor43MetadataByRepoIDAndStage(repo.ID, models.StageProd) - if err != nil { - log.Error("GetDoor43MetadataByRepoIDAndStage: %v", err) - } - preprod, err := models.GetDoor43MetadataByRepoIDAndStage(repo.ID, models.StagePreProd) - if err != nil { - log.Error("GetDoor43MetadataByRepoIDAndStage: %v", err) - } - draft, err := models.GetDoor43MetadataByRepoIDAndStage(repo.ID, models.StageDraft) - if err != nil { - log.Error("GetDoor43MetadataByRepoIDAndStage: %v", err) - } - latest, err := models.GetDoor43MetadataByRepoIDAndStage(repo.ID, models.StageLatest) - if err != nil { - log.Error("GetDoor43MetadataByRepoIDAndStage: %v", err) - } + // prod, err := models.GetDoor43MetadataByRepoIDAndStage(repo.ID, models.StageProd) + // if err != nil { + // log.Error("GetDoor43MetadataByRepoIDAndStage: %v", err) + // } + // preprod, err := models.GetDoor43MetadataByRepoIDAndStage(repo.ID, models.StagePreProd) + // if err != nil { + // log.Error("GetDoor43MetadataByRepoIDAndStage: %v", err) + // } + // draft, err := models.GetDoor43MetadataByRepoIDAndStage(repo.ID, models.StageDraft) + // if err != nil { + // log.Error("GetDoor43MetadataByRepoIDAndStage: %v", err) + // } + // latest, err := models.GetDoor43MetadataByRepoIDAndStage(repo.ID, models.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(), - } - } + // 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(), + // } + // } + // TODO: Load in Repository's LoadAttributes() function and save to repo.Metadata metadata, err := models.GetDoor43MetadataByRepoIDAndReleaseID(repo.ID, 0) if err != nil && !models.IsErrDoor43MetadataNotExist(err) { log.Error("GetDoor43MetadataByRepoIDAndReleaseID: %v", err) } - if metadata == nil { - metadata, err = repo.GetLatestPreProdCatalogMetadata() - if err != nil { - log.Error("GetLatestPreProdCatalogMetadata: %v", err) - } - } + // if metadata == nil { + // metadata, err = repo.GetLatestPreProdCatalogMetadata() + // if err != nil { + // log.Error("GetLatestPreProdCatalogMetadata: %v", err) + // } + // } var language, title, subject, checkingLevel string var books []string diff --git a/modules/convert/user.go b/modules/convert/user.go index 8083c5e5e4..f5d853fd4d 100644 --- a/modules/convert/user.go +++ b/modules/convert/user.go @@ -24,10 +24,6 @@ func ToUser(user *models.User, signed, authed bool) *api.User { AvatarURL: user.AvatarLink(), Created: user.CreatedUnix.AsTime(), Restricted: user.IsRestricted, - /*** DCS Customizations ***/ - RepoLanguages: user.GetRepoLanguages(), - RepoSubjects: user.GetRepoSubjects(), - /*** END DCS Customizations ***/ } // hide primary email if API caller is anonymous or user keep email private if signed && (!user.KeepEmailPrivate || authed) { diff --git a/modules/convert/user_dcs.go b/modules/convert/user_dcs.go new file mode 100644 index 0000000000..b546f82fa8 --- /dev/null +++ b/modules/convert/user_dcs.go @@ -0,0 +1,22 @@ +// Copyright 2020 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package convert + +import ( + "code.gitea.io/gitea/models" + api "code.gitea.io/gitea/modules/structs" +) + +// ToUserDCS convert models.User to api.User with DCS customized fields populated +// signed shall only be set if requester is logged in. authed shall only be set if user is site admin or user himself +func ToUserDCS(user *models.User, signed, authed bool) *api.User { + if user == nil { + return nil + } + result := ToUser(user, signed, authed) + result.RepoLanguages = user.GetRepoLanguages() + result.RepoSubjects = user.GetRepoSubjects() + return result +} diff --git a/modules/dcs/languages.go b/modules/dcs/languages.go index dfa9e7370e..d9e262ad14 100644 --- a/modules/dcs/languages.go +++ b/modules/dcs/languages.go @@ -38,11 +38,15 @@ func GetLangNames() map[string]interface{} { // GetLanguageFromRepoName determines the language of a repo by its repo name func GetLanguageFromRepoName(repoName string) string { parts := strings.Split(repoName, "_") - if len(parts) > 1 { - ln := GetLangNames() - if _, ok := ln[parts[0]]; ok { - return parts[0] - } + if len(parts) == 2 && IsValidLanguage(parts[0]) && IsValidSubject(parts[1]) { + return parts[0] } return "" } + +// IsValidLanguage returns true if string is a valid language code +func IsValidLanguage(lang string) bool { + ln := GetLangNames() + _, ok := ln[lang] + return ok +} diff --git a/modules/dcs/subjects.go b/modules/dcs/subjects.go index 860acdbcb7..a3700d7bf6 100644 --- a/modules/dcs/subjects.go +++ b/modules/dcs/subjects.go @@ -36,10 +36,14 @@ var Subjects = map[string]string{ // GetSubjectFromRepoName determines the subject of a repo by its repo name func GetSubjectFromRepoName(repoName string) string { parts := strings.Split(repoName, "_") - if len(parts) > 1 { - if _, ok := Subjects[parts[1]]; ok { - return Subjects[parts[1]] - } + if len(parts) == 2 && IsValidSubject(parts[1]) && IsValidLanguage(parts[0]) { + return Subjects[parts[1]] } return "" } + +// IsValidSubject returns true if it is a valid subject +func IsValidSubject(subject string) bool { + _, ok := Subjects[subject] + return ok +} diff --git a/routers/api/v1/admin/user.go b/routers/api/v1/admin/user.go index 5dd8cd99fe..914a2c1dff 100644 --- a/routers/api/v1/admin/user.go +++ b/routers/api/v1/admin/user.go @@ -407,7 +407,9 @@ func GetAllUsers(ctx *context.APIContext) { results := make([]*api.User, len(users)) for i := range users { - results[i] = convert.ToUser(users[i], ctx.IsSigned, ctx.User.IsAdmin) + /*** DCS Customizations ***/ + results[i] = convert.ToUserDCS(users[i], ctx.IsSigned, ctx.User.IsAdmin) + /*** END DCS Customizations ***/ } ctx.SetLinkHeader(int(maxResults), listOptions.PageSize) diff --git a/routers/api/v1/user/user.go b/routers/api/v1/user/user.go index d970f10089..d9fd5eff58 100644 --- a/routers/api/v1/user/user.go +++ b/routers/api/v1/user/user.go @@ -82,7 +82,9 @@ func Search(ctx *context.APIContext) { results := make([]*api.User, len(users)) for i := range users { - results[i] = convert.ToUser(users[i], ctx.IsSigned, ctx.User != nil && ctx.User.IsAdmin) + /*** DCS Customizations ***/ + results[i] = convert.ToUserDCS(users[i], ctx.IsSigned, ctx.User != nil && ctx.User.IsAdmin) + /*** END DCS Customizations ***/ } ctx.SetLinkHeader(int(maxResults), listOptions.PageSize) @@ -119,7 +121,9 @@ func GetInfo(ctx *context.APIContext) { return } - ctx.JSON(http.StatusOK, convert.ToUser(u, ctx.IsSigned, ctx.User != nil && (ctx.User.ID == u.ID || ctx.User.IsAdmin))) + /*** DCS Customizations ***/ + ctx.JSON(http.StatusOK, convert.ToUserDCS(u, ctx.IsSigned, ctx.User != nil && (ctx.User.ID == u.ID || ctx.User.IsAdmin))) + /*** END DCS Customizations ***/ } // GetAuthenticatedUser get current user's information @@ -133,7 +137,9 @@ func GetAuthenticatedUser(ctx *context.APIContext) { // "200": // "$ref": "#/responses/User" - ctx.JSON(http.StatusOK, convert.ToUser(ctx.User, ctx.IsSigned, ctx.User != nil)) + /*** DCS Customizations ***/ + ctx.JSON(http.StatusOK, convert.ToUserDCS(ctx.User, ctx.IsSigned, ctx.User != nil)) + /*** END DCS Customizations ***/ } // GetUserHeatmapData is the handler to get a users heatmap