162 lines
3.3 KiB
Go
162 lines
3.3 KiB
Go
|
package arn
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
|
||
|
"github.com/aerogo/nano"
|
||
|
)
|
||
|
|
||
|
// Company represents an anime studio, producer or licensor.
|
||
|
type Company struct {
|
||
|
Name CompanyName `json:"name" editable:"true"`
|
||
|
Description string `json:"description" editable:"true" type:"textarea"`
|
||
|
Email string `json:"email" editable:"true"`
|
||
|
Links []*Link `json:"links" editable:"true"`
|
||
|
|
||
|
// Mixins
|
||
|
hasID
|
||
|
hasMappings
|
||
|
hasLikes
|
||
|
hasDraft
|
||
|
|
||
|
// Other editable fields
|
||
|
Location *Location `json:"location" editable:"true"`
|
||
|
Tags []string `json:"tags" editable:"true"`
|
||
|
|
||
|
// Editing dates
|
||
|
hasCreator
|
||
|
hasEditor
|
||
|
}
|
||
|
|
||
|
// NewCompany creates a new company.
|
||
|
func NewCompany() *Company {
|
||
|
return &Company{
|
||
|
hasID: hasID{
|
||
|
ID: GenerateID("Company"),
|
||
|
},
|
||
|
Name: CompanyName{},
|
||
|
Links: []*Link{},
|
||
|
Tags: []string{},
|
||
|
hasCreator: hasCreator{
|
||
|
Created: DateTimeUTC(),
|
||
|
},
|
||
|
hasMappings: hasMappings{
|
||
|
Mappings: []*Mapping{},
|
||
|
},
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Link returns a single company.
|
||
|
func (company *Company) Link() string {
|
||
|
return "/company/" + company.ID
|
||
|
}
|
||
|
|
||
|
// Anime returns the anime connected with this company.
|
||
|
func (company *Company) Anime() (studioAnime []*Anime, producedAnime []*Anime, licensedAnime []*Anime) {
|
||
|
for anime := range StreamAnime() {
|
||
|
if Contains(anime.StudioIDs, company.ID) {
|
||
|
studioAnime = append(studioAnime, anime)
|
||
|
}
|
||
|
|
||
|
if Contains(anime.ProducerIDs, company.ID) {
|
||
|
producedAnime = append(producedAnime, anime)
|
||
|
}
|
||
|
|
||
|
if Contains(anime.LicensorIDs, company.ID) {
|
||
|
licensedAnime = append(licensedAnime, anime)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
SortAnimeByQuality(studioAnime)
|
||
|
SortAnimeByQuality(producedAnime)
|
||
|
SortAnimeByQuality(licensedAnime)
|
||
|
|
||
|
return studioAnime, producedAnime, licensedAnime
|
||
|
}
|
||
|
|
||
|
// Publish publishes the company draft.
|
||
|
func (company *Company) Publish() error {
|
||
|
// No title
|
||
|
if company.Name.English == "" {
|
||
|
return errors.New("No English company name")
|
||
|
}
|
||
|
|
||
|
return publish(company)
|
||
|
}
|
||
|
|
||
|
// Unpublish turns the company into a draft.
|
||
|
func (company *Company) Unpublish() error {
|
||
|
return unpublish(company)
|
||
|
}
|
||
|
|
||
|
// String implements the default string serialization.
|
||
|
func (company *Company) String() string {
|
||
|
return company.Name.English
|
||
|
}
|
||
|
|
||
|
// TypeName returns the type name.
|
||
|
func (company *Company) TypeName() string {
|
||
|
return "Company"
|
||
|
}
|
||
|
|
||
|
// Self returns the object itself.
|
||
|
func (company *Company) Self() Loggable {
|
||
|
return company
|
||
|
}
|
||
|
|
||
|
// GetCompany returns a single company.
|
||
|
func GetCompany(id string) (*Company, error) {
|
||
|
obj, err := DB.Get("Company", id)
|
||
|
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return obj.(*Company), nil
|
||
|
}
|
||
|
|
||
|
// StreamCompanies returns a stream of all companies.
|
||
|
func StreamCompanies() <-chan *Company {
|
||
|
channel := make(chan *Company, nano.ChannelBufferSize)
|
||
|
|
||
|
go func() {
|
||
|
for obj := range DB.All("Company") {
|
||
|
channel <- obj.(*Company)
|
||
|
}
|
||
|
|
||
|
close(channel)
|
||
|
}()
|
||
|
|
||
|
return channel
|
||
|
}
|
||
|
|
||
|
// FilterCompanies filters all companies by a custom function.
|
||
|
func FilterCompanies(filter func(*Company) bool) []*Company {
|
||
|
var filtered []*Company
|
||
|
|
||
|
channel := DB.All("Company")
|
||
|
|
||
|
for obj := range channel {
|
||
|
realObject := obj.(*Company)
|
||
|
|
||
|
if filter(realObject) {
|
||
|
filtered = append(filtered, realObject)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return filtered
|
||
|
}
|
||
|
|
||
|
// AllCompanies returns a slice of all companies.
|
||
|
func AllCompanies() []*Company {
|
||
|
all := make([]*Company, 0, DB.Collection("Company").Count())
|
||
|
|
||
|
stream := StreamCompanies()
|
||
|
|
||
|
for obj := range stream {
|
||
|
all = append(all, obj)
|
||
|
}
|
||
|
|
||
|
return all
|
||
|
}
|