diff --git a/database.go b/database.go index 5eb742b..f003553 100644 --- a/database.go +++ b/database.go @@ -19,14 +19,14 @@ import ( // Note: SQLite may not be compiled with support for UPDATE/DELETE LIMIT const ( - DatabaseVersion = 1 - AccountKeyLength = 32 // Was using MD5 hashes - MessageMaxLength = 4096 - GoogleOAuthURL = "https://www.googleapis.com/oauth2/v3/userinfo?alt=json&access_token=" + databaseVersion = 1 + accountKeyLength = 32 // Was using MD5 hashes + messageMaxLength = 4096 + googleOAuthURL = "https://www.googleapis.com/oauth2/v3/userinfo?alt=json&access_token=" ) // TODO: Add indexes -var DatabaseTables = map[string][]string{ +var databaseTables = map[string][]string{ "accounts": { "`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT", "`key` VARCHAR(145) NOT NULL DEFAULT ''", @@ -68,20 +68,20 @@ var DatabaseTables = map[string][]string{ "`key` VARCHAR(50) NOT NULL PRIMARY KEY", "`value` TEXT NOT NULL DEFAULT ''"}} -type Database struct { +type database struct { db *sql.DB FuncGreatest string } var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") -type Account struct { +type account struct { ID int Key string StreakBuffer int } -type Session struct { +type session struct { ID int `json:"id"` Posted int `json:"posted"` Started int `json:"started"` @@ -92,24 +92,24 @@ type Session struct { Modified int `json:"modified"` } -type RecentSession struct { - Session +type recentSession struct { + session AccountID int AccountName string AccountEmail string } func generateKey() string { - b := make([]rune, AccountKeyLength) + b := make([]rune, accountKeyLength) for i := range b { b[i] = letters[rand.Intn(len(letters))] } return string(b) } -func Connect(driver string, dataSource string) (*Database, error) { +func connect(driver string, dataSource string) (*database, error) { var err error - d := new(Database) + d := new(database) d.db, err = sql.Open(driver, dataSource) if err != nil { @@ -141,7 +141,7 @@ func Connect(driver string, dataSource string) (*Database, error) { return d, nil } -func (d *Database) CreateTables() error { +func (d *database) CreateTables() error { var ( tcolumns string err error @@ -152,7 +152,7 @@ func (d *Database) CreateTables() error { createQueryExtra = " ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_unicode_ci" } - for tname, tcols := range DatabaseTables { + for tname, tcols := range databaseTables { tcolumns = strings.Join(tcols, ",") if config.DBDriver == "mysql" { tcolumns = strings.Replace(tcolumns, "AUTOINCREMENT", "AUTO_INCREMENT", -1) @@ -167,7 +167,7 @@ func (d *Database) CreateTables() error { return nil } -func (d *Database) Migrate() error { +func (d *database) Migrate() error { rows, err := d.db.Query("SELECT `value` FROM meta WHERE `key`=?", "version") if err != nil { return fmt.Errorf("failed to fetch database version: %s", err) @@ -190,17 +190,17 @@ func (d *Database) Migrate() error { if version == -1 { panic("Unable to migrate database: database version unknown") } else if version == 0 { - _, err := d.db.Exec("UPDATE meta SET `value`=? WHERE `key`=?", strconv.Itoa(DatabaseVersion), "version") + _, err := d.db.Exec("UPDATE meta SET `value`=? WHERE `key`=?", strconv.Itoa(databaseVersion), "version") if err != nil { return fmt.Errorf("failed to save database version: %s", err) } } migrated := false - for version < DatabaseVersion { + for version < databaseVersion { switch version { case 1: - // DatabaseVersion 2 migration queries will go here + // databaseVersion 2 migration queries will go here } version++ @@ -208,7 +208,7 @@ func (d *Database) Migrate() error { } if migrated { - _, err := d.db.Exec("UPDATE meta SET `value`=? WHERE `key`=?", strconv.Itoa(DatabaseVersion), "version") + _, err := d.db.Exec("UPDATE meta SET `value`=? WHERE `key`=?", strconv.Itoa(databaseVersion), "version") if err != nil { return fmt.Errorf("failed to save updated database version: %s", err) } @@ -217,10 +217,10 @@ func (d *Database) Migrate() error { return nil } -func (d *Database) authenticate(token string) (*Account, error) { +func (d *database) authenticate(token string) (*account, error) { key := "" - resp, err := http.Get(GoogleOAuthURL + token) + resp, err := http.Get(googleOAuthURL + token) if err != nil { return nil, fmt.Errorf("failed to get userinfo from Google: %s", err) } @@ -284,8 +284,8 @@ func (d *Database) authenticate(token string) (*Account, error) { return account, nil } -func (d *Database) getAccount(key string) (*Account, error) { - a := new(Account) +func (d *database) getAccount(key string) (*account, error) { + a := new(account) err := d.db.QueryRow("SELECT `id`, `key`, `streakbuffer` FROM accounts WHERE `key`=?", key).Scan(&a.ID, &a.Key, &a.StreakBuffer) if err == sql.ErrNoRows { return nil, nil @@ -296,7 +296,7 @@ func (d *Database) getAccount(key string) (*Account, error) { return a, nil } -func (d *Database) getStreak(accountID int) (int64, int64, int64, error) { +func (d *database) getStreak(accountID int) (int64, int64, int64, error) { streakDay := int64(0) streakEnd := int64(0) topStreak := int64(0) @@ -322,7 +322,7 @@ func (d *Database) getStreak(accountID int) (int64, int64, int64, error) { return streakDay, streakEnd, topStreak, nil } -func (d *Database) updateLastActive(accountID int) error { +func (d *database) updateLastActive(accountID int) error { _, err := d.db.Exec("UPDATE accounts SET `lastactive`=? WHERE `id`=?", time.Now().Unix(), accountID) if err != nil { err = fmt.Errorf("failed to update last active: %s", err) @@ -330,7 +330,7 @@ func (d *Database) updateLastActive(accountID int) error { return err } -func (d *Database) updateTopStreak(accountID int) error { +func (d *database) updateTopStreak(accountID int) error { _, err := d.db.Exec("UPDATE accounts SET `topstreak`="+d.FuncGreatest+"(`streak`, `topstreak`) WHERE `id`=?", accountID) if err != nil { err = fmt.Errorf("failed to update top streak: %s", err) @@ -338,7 +338,7 @@ func (d *Database) updateTopStreak(accountID int) error { return err } -func (d *Database) updateStreakBuffer(accountID int, streakBuffer int) error { +func (d *database) updateStreakBuffer(accountID int, streakBuffer int) error { _, err := d.db.Exec("UPDATE accounts SET `streakbuffer`=? WHERE `id`=?", streakBuffer, accountID) if err != nil { err = fmt.Errorf("failed to update streak buffer: %s", err) @@ -346,7 +346,7 @@ func (d *Database) updateStreakBuffer(accountID int, streakBuffer int) error { return err } -func (d *Database) calculateStreak(accountID int, streakBuffer int, tz *time.Location) (int, error) { +func (d *database) calculateStreak(accountID int, streakBuffer int, tz *time.Location) (int, error) { streak := 0 t := time.Now().In(tz) @@ -372,7 +372,7 @@ func (d *Database) calculateStreak(accountID int, streakBuffer int, tz *time.Loc return streak, nil } -func (d *Database) setStreak(streakDay int, accountID int, streakBuffer int, tz *time.Location) error { +func (d *database) setStreak(streakDay int, accountID int, streakBuffer int, tz *time.Location) error { t := time.Now().In(tz) if beforeWindowStart(t, streakBuffer) { t = t.AddDate(0, 0, 1) @@ -396,7 +396,7 @@ func (d *Database) setStreak(streakDay int, accountID int, streakBuffer int, tz return nil } -func (d *Database) setSessionStreakDay(started int, streakDay int, accountID int) error { +func (d *database) setSessionStreakDay(started int, streakDay int, accountID int) error { _, err := d.db.Exec("UPDATE sessions SET `streakday`=? WHERE `account`=? AND `started`=?", streakDay, accountID, started) if err != nil { return fmt.Errorf("failed to set session streak day: %s", err) @@ -405,8 +405,8 @@ func (d *Database) setSessionStreakDay(started int, streakDay int, accountID int return nil } -func (d *Database) scanSession(rows *sql.Rows) (*Session, error) { - s := new(Session) +func (d *database) scanSession(rows *sql.Rows) (*session, error) { + s := new(session) err := rows.Scan(&s.ID, &s.Posted, &s.Started, &s.StreakDay, &s.Length, &s.Completed, &s.Message, &s.Modified) if err != nil { return nil, fmt.Errorf("failed to scan session: %s", err) @@ -415,8 +415,8 @@ func (d *Database) scanSession(rows *sql.Rows) (*Session, error) { return s, nil } -func (d *Database) scanRecentSession(rows *sql.Rows) (*RecentSession, error) { - s := new(RecentSession) +func (d *database) scanRecentSession(rows *sql.Rows) (*recentSession, error) { + s := new(recentSession) err := rows.Scan(&s.ID, &s.Posted, &s.Started, &s.StreakDay, &s.Length, &s.Completed, &s.Message, &s.Modified, &s.AccountID, &s.AccountName, &s.AccountEmail) if err != nil { return nil, fmt.Errorf("failed to scan session: %s", err) @@ -425,11 +425,11 @@ func (d *Database) scanRecentSession(rows *sql.Rows) (*RecentSession, error) { return s, nil } -func (d *Database) addSession(s Session, updateSessionStarted int, accountID int, appVer string, appMarket string) (bool, error) { +func (d *database) addSession(s session, updateSessionStarted int, accountID int, appVer string, appMarket string) (bool, error) { var ( - existingSession *Session - updateSession *Session - keepSession *Session + existingSession *session + updateSession *session + keepSession *session err error ) @@ -450,8 +450,8 @@ func (d *Database) addSession(s Session, updateSessionStarted int, accountID int return false, nil } - if len(s.Message) > MessageMaxLength { - s.Message = s.Message[:MessageMaxLength] + if len(s.Message) > messageMaxLength { + s.Message = s.Message[:messageMaxLength] } // Fix zero completed from older versions of the app @@ -484,7 +484,7 @@ func (d *Database) addSession(s Session, updateSessionStarted int, accountID int return true, nil } -func (d *Database) getSessionByID(sessionID int, accountID int) (*Session, error) { +func (d *database) getSessionByID(sessionID int, accountID int) (*session, error) { rows, err := d.db.Query("SELECT `id`, `posted`, `started`, `streakday`, `length`, `completed`, `message`, `modified` FROM sessions WHERE `account`=? AND `id`=?", accountID, sessionID) if err != nil { return nil, fmt.Errorf("failed to fetch session: %s", err) @@ -498,7 +498,7 @@ func (d *Database) getSessionByID(sessionID int, accountID int) (*Session, error return nil, nil } -func (d *Database) getSessionByStarted(started int, accountID int) (*Session, error) { +func (d *database) getSessionByStarted(started int, accountID int) (*session, error) { rows, err := d.db.Query("SELECT `id`, `posted`, `started`, `streakday`, `length`, `completed`, `message`, `modified` FROM sessions WHERE `account`=? AND `started`=?", accountID, started) if err != nil { return nil, fmt.Errorf("failed to fetch session: %s", err) @@ -512,7 +512,7 @@ func (d *Database) getSessionByStarted(started int, accountID int) (*Session, er return nil, nil } -func (d *Database) sessionExistsByDate(date time.Time, accountID int, streakBuffer int) (bool, error) { +func (d *database) sessionExistsByDate(date time.Time, accountID int, streakBuffer int) (bool, error) { windowStart := atWindowStart(date, streakBuffer) windowEnd := atWindowStart(windowStart.AddDate(0, 0, 1), streakBuffer) @@ -527,8 +527,8 @@ func (d *Database) sessionExistsByDate(date time.Time, accountID int, streakBuff return sessionid > 0, nil } -func (d *Database) getAllSessions(accountID int) ([]*Session, error) { - var sessions []*Session +func (d *database) getAllSessions(accountID int) ([]*session, error) { + var sessions []*session rows, err := d.db.Query("SELECT `id`, `posted`, `started`, `streakday`, `length`, `completed`, `message`, `modified` FROM sessions WHERE `account`=?", accountID) if err != nil { @@ -548,8 +548,8 @@ func (d *Database) getAllSessions(accountID int) ([]*Session, error) { return sessions, nil } -func (d *Database) getRecentSessions() ([]*RecentSession, error) { - var sessions []*RecentSession +func (d *database) getRecentSessions() ([]*recentSession, error) { + var sessions []*recentSession rows, err := d.db.Query("SELECT `sessions`.`id`, `sessions`.`posted`, `sessions`.`started`, `sessions`.`streakday`, `sessions`.`length`, `sessions`.`completed`, `sessions`.`message`, `sessions`.`modified`, `accounts`.`id` AS `accountid`, `accounts`.`name`, `accounts`.`email` FROM `sessions` LEFT OUTER JOIN `accounts` ON `sessions`.`account` = `accounts`.`id` WHERE `accounts`.`sessionspublic` = 1 AND `sessions`.`length` > 110 ORDER BY `sessions`.`completed` DESC LIMIT 50") if err != nil { @@ -569,7 +569,7 @@ func (d *Database) getRecentSessions() ([]*RecentSession, error) { return sessions, nil } -func (d *Database) deleteSession(started int, accountID int) (bool, error) { +func (d *database) deleteSession(started int, accountID int) (bool, error) { r, err := d.db.Exec("DELETE FROM sessions WHERE `account`=? AND `started`=?", accountID, started) if err != nil { return false, fmt.Errorf("failed to delete session: %s", err) diff --git a/main.go b/main.go index 7089590..f299b1e 100644 --- a/main.go +++ b/main.go @@ -1,4 +1,4 @@ -// MediNET - Session repository and community portal for Meditation Assistant +// MediNET - session repository and community portal for Meditation Assistant // https://gitlab.com/tslocum/medinet // // This program is free software: you can redistribute it and/or modify @@ -29,7 +29,7 @@ import ( "gopkg.in/yaml.v2" ) -type Config struct { +type configuration struct { TimeZone string DBDriver string DBSource string @@ -37,7 +37,7 @@ type Config struct { Web string } -type Statistics struct { +type statistics struct { AccountsCreated int ActiveAccounts []int @@ -46,10 +46,10 @@ type Statistics struct { } var ( - db *Database - config *Config - PrintDebug bool - stats *Statistics + db *database + config *configuration + printDebug bool + stats *statistics serverLocation *time.Location regexpNumbers = regexp.MustCompile("[0-9]+") @@ -57,7 +57,7 @@ var ( ) func logDebug(message string) { - if PrintDebug { + if printDebug { log.Println(message) } } @@ -133,7 +133,7 @@ func main() { log.Fatalf("Failed to read %s: %v", opts.ConfigFile, err) } - config = new(Config) + config = new(configuration) err = yaml.Unmarshal(configData, config) if err != nil { log.Fatalf("Failed to read %s: %v", opts.ConfigFile, err) @@ -153,12 +153,12 @@ func main() { failOnError(err) serverLocation = loc - PrintDebug = opts.Debug + printDebug = opts.Debug - stats = new(Statistics) + stats = new(statistics) go printStatistics() - db, err = Connect(config.DBDriver, config.DBSource) + db, err = connect(config.DBDriver, config.DBSource) failOnError(err) initWeb() diff --git a/web.go b/web.go index 0abce31..2bafc09 100644 --- a/web.go +++ b/web.go @@ -151,7 +151,7 @@ func handleMediNET(w http.ResponseWriter, r *http.Request) { postsession := r.FormValue("postsession") updateSessionStarted, _ := strconv.Atoi(r.FormValue("editstarted")) - var uploadsessions []Session + var uploadsessions []session err = json.Unmarshal([]byte(u), &uploadsessions) if err != nil { log.Printf("ERROR! %v", err)