/* Copyright © 2023 Philipp Wolfer This file is part of Scotty. Scotty is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Scotty is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Scotty. If not, see . */ package storage import ( "encoding/json" "log" "os" "time" "github.com/glebarez/sqlite" "golang.org/x/oauth2" "gorm.io/datatypes" "gorm.io/gorm" "gorm.io/gorm/clause" "gorm.io/gorm/logger" ) type Database struct { db *gorm.DB } func New(dsn string) (db Database, err error) { newLogger := logger.New( log.New(os.Stderr, "\r\n", log.LstdFlags), logger.Config{ LogLevel: logger.Error, // Log level Info will output everything }, ) gornDb, err := gorm.Open(sqlite.Open(dsn), &gorm.Config{Logger: newLogger}) if err != nil { return } db.db = gornDb // Migrate the schema err = gornDb.AutoMigrate(&ImportTimestamp{}, &OAuth2Token{}) return } func (db Database) GetImportTimestamp(source string, target string, entity string) (time.Time, error) { result := ImportTimestamp{ SourceService: source, TargetService: target, Entity: entity, } err := db.db.Limit(1).Find(&result).Error return result.Timestamp, err } func (db Database) SetImportTimestamp(source string, target string, entity string, timestamp time.Time) error { entry := ImportTimestamp{ SourceService: source, TargetService: target, Entity: entity, Timestamp: timestamp, } err := db.db.Clauses(clause.OnConflict{ DoUpdates: clause.AssignmentColumns([]string{"timestamp", "updated_at"}), }).Create(&entry).Error return err } func (db Database) GetOAuth2Token(service string) (*oauth2.Token, error) { result := OAuth2Token{ Service: service, } err := db.db.Limit(1).Find(&result).Error if err != nil { return nil, err } token := oauth2.Token{} if result.Token != nil { err = json.Unmarshal(result.Token, &token) } return &token, err } func (db Database) SetOAuth2Token(service string, token *oauth2.Token) error { jsonTok, err := json.Marshal(token) if err != nil { return err } entry := OAuth2Token{ Service: service, Token: datatypes.JSON(jsonTok), } err = db.db.Clauses(clause.OnConflict{ DoUpdates: clause.AssignmentColumns([]string{"token", "updated_at"}), }).Create(&entry).Error return err }