2019-05-06 01:40:41 +03:00
|
|
|
package models
|
|
|
|
|
2020-05-30 23:19:05 +03:00
|
|
|
import (
|
|
|
|
"database/sql/driver"
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
|
|
|
"github.com/jinzhu/gorm"
|
2020-08-30 02:42:00 +03:00
|
|
|
"math"
|
2020-05-30 23:19:05 +03:00
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
"time"
|
|
|
|
)
|
2020-05-30 21:41:27 +03:00
|
|
|
|
2019-05-06 01:40:41 +03:00
|
|
|
const (
|
2020-05-24 14:41:19 +03:00
|
|
|
UserKey = "user"
|
2020-05-30 21:41:27 +03:00
|
|
|
ImprintKey = "imprint"
|
2020-05-24 14:41:19 +03:00
|
|
|
AuthCookieKey = "wakapi_auth"
|
2019-05-06 01:40:41 +03:00
|
|
|
)
|
2020-05-30 21:41:27 +03:00
|
|
|
|
|
|
|
type MigrationFunc func(db *gorm.DB) error
|
|
|
|
|
|
|
|
type KeyStringValue struct {
|
|
|
|
Key string `gorm:"primary_key"`
|
2020-05-30 22:10:44 +03:00
|
|
|
Value string `gorm:"type:text"`
|
2020-05-30 21:41:27 +03:00
|
|
|
}
|
2020-05-30 23:19:05 +03:00
|
|
|
|
2020-09-12 17:09:23 +03:00
|
|
|
type Filters struct {
|
|
|
|
Project string
|
|
|
|
OS string
|
|
|
|
Language string
|
|
|
|
Editor string
|
|
|
|
Machine string
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewFiltersWith(entity uint8, key string) *Filters {
|
|
|
|
switch entity {
|
|
|
|
case SummaryProject:
|
|
|
|
return &Filters{Project: key}
|
|
|
|
case SummaryOS:
|
|
|
|
return &Filters{Project: key}
|
|
|
|
case SummaryLanguage:
|
|
|
|
return &Filters{Project: key}
|
|
|
|
case SummaryEditor:
|
|
|
|
return &Filters{Project: key}
|
|
|
|
case SummaryMachine:
|
|
|
|
return &Filters{Project: key}
|
|
|
|
}
|
|
|
|
return &Filters{}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f *Filters) First() (bool, uint8, string) {
|
|
|
|
if f.Project != "" {
|
|
|
|
return true, SummaryProject, f.Project
|
|
|
|
} else if f.OS != "" {
|
|
|
|
return true, SummaryOS, f.OS
|
|
|
|
} else if f.Language != "" {
|
|
|
|
return true, SummaryLanguage, f.Language
|
|
|
|
} else if f.Editor != "" {
|
|
|
|
return true, SummaryEditor, f.Editor
|
|
|
|
} else if f.Machine != "" {
|
|
|
|
return true, SummaryMachine, f.Machine
|
|
|
|
}
|
|
|
|
return false, 0, ""
|
|
|
|
}
|
|
|
|
|
2020-08-30 02:42:00 +03:00
|
|
|
type CustomTime time.Time
|
|
|
|
|
2020-05-30 23:19:05 +03:00
|
|
|
func (j *CustomTime) UnmarshalJSON(b []byte) error {
|
2020-08-30 02:45:01 +03:00
|
|
|
s := strings.Replace(strings.Trim(string(b), "\""), ".", "", 1)
|
2020-05-30 23:19:05 +03:00
|
|
|
i, err := strconv.ParseInt(s, 10, 64)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2020-08-30 02:42:00 +03:00
|
|
|
t := time.Unix(0, i*int64(math.Pow10(19-len(s))))
|
2020-05-30 23:19:05 +03:00
|
|
|
*j = CustomTime(t)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (j *CustomTime) Scan(value interface{}) error {
|
|
|
|
switch value.(type) {
|
|
|
|
case string:
|
|
|
|
t, err := time.Parse("2006-01-02 15:04:05-07:00", value.(string))
|
|
|
|
if err != nil {
|
|
|
|
return errors.New(fmt.Sprintf("unsupported date time format: %s", value))
|
|
|
|
}
|
|
|
|
*j = CustomTime(t)
|
|
|
|
case int64:
|
|
|
|
*j = CustomTime(time.Unix(value.(int64), 0))
|
|
|
|
break
|
|
|
|
case time.Time:
|
|
|
|
*j = CustomTime(value.(time.Time))
|
|
|
|
break
|
|
|
|
default:
|
|
|
|
return errors.New(fmt.Sprintf("unsupported type: %T", value))
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (j CustomTime) Value() (driver.Value, error) {
|
|
|
|
return time.Time(j), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (j CustomTime) String() string {
|
|
|
|
t := time.Time(j)
|
2020-08-30 02:42:00 +03:00
|
|
|
return t.Format("2006-01-02 15:04:05.000")
|
2020-05-30 23:19:05 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
func (j CustomTime) Time() time.Time {
|
|
|
|
return time.Time(j)
|
|
|
|
}
|