contentserver/server/repo/repo.go
2013-08-23 15:01:19 +02:00

109 lines
3.1 KiB
Go

package repo
import (
"fmt"
"github.com/foomo/ContentServer/server/repo/content"
"github.com/foomo/ContentServer/server/requests"
"github.com/foomo/ContentServer/server/utils"
)
type Repo struct {
server string
Regions []string
Languages []string
Directory map[string]*content.RepoNode
URIDirectory map[string]*content.RepoNode
Node *content.RepoNode
}
func NewRepo(server string) *Repo {
repo := new(Repo)
repo.server = server
return repo
}
func (repo *Repo) ResolveContent(URI string) (resolved bool, region string, language string, repoNode *content.RepoNode) {
if node, ok := repo.URIDirectory[URI]; ok {
resolved = true
resolvedURI, region, language := node.GetLanguageAndRegionForURI(URI)
if resolvedURI {
return true, region, language, node
} else {
resolved = false
}
} else {
resolved = false
}
return
}
func (repo *Repo) GetURI(region string, language string, id string) string {
repoNode, ok := repo.Directory[id]
if ok {
languageURIs, regionExists := repoNode.URIs[region]
if regionExists {
languageURI, languageURIExists := languageURIs[language]
if languageURIExists {
return languageURI
}
}
}
return ""
}
func (repo *Repo) GetNode(repoNode *content.RepoNode, expanded bool, mimeTypes []string, path []string, region string, language string) *content.Node {
node := content.NewNode()
node.Item.Name = repoNode.GetName(language)
node.Item.URI = repoNode.URIs[region][language]
//fmt.Println(region, language, repoNode.URIs[region][language], repoNode.URIs)
for id, childNode := range repoNode.Nodes {
if expanded && !childNode.Hidden && childNode.IsOneOfTheseMimeTypes(mimeTypes) {
// || in path and in region mimes
node.Nodes[id] = repo.GetNode(childNode, expanded, mimeTypes, path, region, language)
}
}
return node
}
func (repo *Repo) GetContent(r *requests.Content) *content.SiteContent {
c := content.NewSiteContent()
resolved, region, language, node := repo.ResolveContent(r.URI)
if resolved {
// forbidden ?!
c.Region = region
c.Language = language
c.Status = content.STATUS_OK
c.Content.Item = content.NewItem()
c.Content.Item.Id = node.Id
c.Content.Item.Name = node.GetName(language)
for treeName, treeRequest := range r.Nodes {
// fmt.Println("getting tree", treeName, treeRequest)
c.Nodes[treeName] = repo.GetNode(repo.Directory[treeRequest.Id], treeRequest.Expand, treeRequest.MimeTypes, []string{}, region, language)
}
} else {
c.Status = content.STATUS_NOT_FOUND
}
return c
}
func (repo *Repo) builDirectory(dirNode *content.RepoNode) {
repo.Directory[dirNode.Id] = dirNode
for _, languageURIs := range dirNode.URIs {
for _, URI := range languageURIs {
fmt.Println(URI, "=>", dirNode.Id)
repo.URIDirectory[URI] = dirNode
}
}
for _, childNode := range dirNode.Nodes {
repo.builDirectory(childNode)
}
}
func (repo *Repo) Update() {
repo.Node = content.NewRepoNode()
utils.Get(repo.server, repo.Node)
repo.Directory = make(map[string]*content.RepoNode)
repo.URIDirectory = make(map[string]*content.RepoNode)
repo.builDirectory(repo.Node)
}