hmn/src/models/project.go

128 lines
3.4 KiB
Go
Raw Permalink Normal View History

package models
import (
"reflect"
2021-11-08 19:16:54 +00:00
"regexp"
"strings"
"time"
)
2021-05-06 04:04:58 +00:00
const (
HMNProjectID = 1
HMNProjectSlug = "hmn"
)
var ProjectType = reflect.TypeOf(Project{})
2021-05-05 20:34:32 +00:00
type ProjectLifecycle int
const (
ProjectLifecycleUnapproved ProjectLifecycle = iota
2021-05-05 20:34:32 +00:00
ProjectLifecycleApprovalRequired
ProjectLifecycleActive
ProjectLifecycleHiatus
ProjectLifecycleDead
ProjectLifecycleLTSRequired
ProjectLifecycleLTS
)
2021-12-02 10:53:36 +00:00
var AllProjectLifecycles = []ProjectLifecycle{
ProjectLifecycleUnapproved,
ProjectLifecycleApprovalRequired,
ProjectLifecycleActive,
ProjectLifecycleHiatus,
ProjectLifecycleDead,
ProjectLifecycleLTSRequired,
ProjectLifecycleLTS,
}
2021-12-11 19:08:10 +00:00
// NOTE(asaf): Just checking the lifecycle is not sufficient. Visible projects also must not be hidden.
2021-06-06 23:48:43 +00:00
var VisibleProjectLifecycles = []ProjectLifecycle{
ProjectLifecycleActive,
ProjectLifecycleHiatus,
ProjectLifecycleLTSRequired, // NOTE(asaf): LTS means complete
ProjectLifecycleLTS,
}
2021-12-11 19:08:10 +00:00
func (lc ProjectLifecycle) In(lcs []ProjectLifecycle) bool {
for _, v := range lcs {
if lc == v {
return true
}
}
return false
}
2021-06-06 23:48:43 +00:00
const RecentProjectUpdateTimespanSec = 60 * 60 * 24 * 28 // NOTE(asaf): Four weeks
type Project struct {
ID int `db:"id"`
2021-05-11 22:53:23 +00:00
ForumID *int `db:"forum_id"`
2021-06-06 23:48:43 +00:00
Slug string `db:"slug"`
Name string `db:"name"`
2021-11-11 19:00:46 +00:00
TagID *int `db:"tag"`
2021-06-06 23:48:43 +00:00
Blurb string `db:"blurb"`
Description string `db:"description"`
ParsedDescription string `db:"descparsed"`
2021-05-11 22:53:23 +00:00
Lifecycle ProjectLifecycle `db:"lifecycle"` // TODO(asaf): Ensure we only fetch projects in the correct lifecycle phase everywhere.
2021-05-05 20:34:32 +00:00
Color1 string `db:"color_1"`
Color2 string `db:"color_2"`
Personal bool `db:"personal"`
Hidden bool `db:"hidden"`
Featured bool `db:"featured"`
DateApproved time.Time `db:"date_approved"`
2022-03-06 12:48:47 +00:00
DateCreated time.Time `db:"date_created"`
AllLastUpdated time.Time `db:"all_last_updated"`
ForumLastUpdated time.Time `db:"forum_last_updated"`
BlogLastUpdated time.Time `db:"blog_last_updated"`
AnnotationLastUpdated time.Time `db:"annotation_last_updated"`
2021-08-28 13:10:26 +00:00
ForumEnabled bool `db:"forum_enabled"`
BlogEnabled bool `db:"blog_enabled"`
LibraryEnabled bool `db:"library_enabled"` // TODO: Delete this field from the db
}
func (p *Project) IsHMN() bool {
return p.ID == HMNProjectID
}
2021-04-22 23:02:50 +00:00
func (p *Project) Subdomain() string {
if p.IsHMN() {
return ""
}
2021-05-06 04:04:58 +00:00
return p.Slug
2021-04-22 23:02:50 +00:00
}
2021-11-08 19:16:54 +00:00
// Checks whether the project has forums enabled. This should restrict the creation of new forum
// content, but it should NOT prevent the viewing of existing forum content. (Projects may at one
// point have forums enabled, write some stuff, and then later disable forums, and we want that
// content to stay accessible.) Hiding the navigation is ok.
func (p *Project) HasForums() bool {
return !p.Personal && p.ForumEnabled
}
// Same as HasForums, but for blogs.
func (p *Project) HasBlog() bool {
return !p.Personal && p.BlogEnabled
}
2021-11-08 19:16:54 +00:00
var slugUnsafeChars = regexp.MustCompile(`[^a-zA-Z0-9-]`)
var slugHyphenRun = regexp.MustCompile(`-+`)
// Generates a URL-safe version of a personal project's name.
func GeneratePersonalProjectSlug(name string) string {
slug := name
slug = slugUnsafeChars.ReplaceAllLiteralString(slug, "-")
slug = slugHyphenRun.ReplaceAllLiteralString(slug, "-")
slug = strings.Trim(slug, "-")
slug = strings.ToLower(slug)
return slug
}