Skip to content
Snippets Groups Projects
Commit f4dc2fce authored by Tóth Miklós Tibor's avatar Tóth Miklós Tibor :shrug:
Browse files

switch to Gorm

parent fec790bc
No related branches found
No related tags found
No related merge requests found
Pipeline #9109 passed
......@@ -59,7 +59,7 @@ func SendHandler(w http.ResponseWriter, r *http.Request) {
}
go func() {
e := db.UpdateUser(&u)
e := db.UpdateUser(u)
if e != nil {
fmt.Println(e)
}
......
package db
import (
"crypto/tls"
"fmt"
"git.sch.bme.hu/mikewashere/voxfrontend/languages"
"github.com/go-pg/pg/v10"
"github.com/go-pg/pg/v10/orm"
"github.com/google/uuid"
"gitlab.com/MikeTTh/env"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"net/http"
"os"
"strings"
"time"
)
const cookiename = "uid"
type User struct {
Name string `pg:"name"`
SchAcc string `pg:"schacc,pk"`
Lang languages.Voice `pg:"lang"`
Dark bool `pg:"dark"`
Name string `gorm:"type:varchar(50)"`
SchAcc string `gorm:"primaryKey;type:varchar(22)"`
Lang languages.Voice `gorm:"type:varchar(10)"`
Dark bool `gorm:"dark"`
}
type Cookie struct {
Id string `pg:"id,pk,default:gen_random_uuid()"`
SchAcc string `pg:"user_schacc"`
User *User `pg:"rel:has-one"`
Id uuid.UUID `gorm:"type:uuid;primaryKey;default:gen_random_uuid()"`
SchAcc string `gorm:"type:varchar(22)"`
User *User `gorm:"belongsTo:User;foreignKey:SchAcc;references:SchAcc"`
}
type Message struct {
Id int64 `pg:"id,pk"`
Sent time.Time `pg:"sent,default:now()"`
Message string `pg:"message"`
SchAcc string `pg:"user_schacc"`
Lang languages.Voice `pg:"lang,default:'🇭🇺'"`
User *User `pg:"rel:has-one"`
}
var db = pg.Connect(&pg.Options{
Addr: func() string {
host := os.Getenv("POSTGRES")
if host == "" {
host = "localhost"
}
if !strings.Contains(host, ":") {
host += ":5432"
}
return host
}(),
User: func() string {
us := os.Getenv("POSTGRES_USER")
if us == "" {
us = "postgres"
}
return us
}(),
Password: func() string {
pw := os.Getenv("POSTGRES_PASS")
if pw == "" {
pw = "postgres"
}
return pw
}(),
TLSConfig: func() *tls.Config {
if os.Getenv("NOTLS") == "true" {
return nil
} else {
return &tls.Config{
InsecureSkipVerify: true,
}
Id uuid.UUID `gorm:"primaryKey"`
Sent time.Time `gorm:"default:now()"`
Message string
SchAcc string `gorm:"type:varchar(22)"`
Lang languages.Voice `gorm:"type:varchar(10);default:'🇭🇺'"`
User *User `gorm:"belongsTo:User;foreignKey:SchAcc;references:SchAcc"`
}
}(),
})
var db *gorm.DB
func init() {
models := []interface{}{
(*User)(nil),
(*Cookie)(nil),
(*Message)(nil),
var err error
db, err = gorm.Open(postgres.Open(env.String("POSTGRES", "postgresql://postgres:postgres@localhost")))
if err != nil {
panic(err)
}
for _, model := range models {
err := db.Model(model).CreateTable(&orm.CreateTableOptions{
IfNotExists: true,
FKConstraints: true,
})
err = db.AutoMigrate(&User{}, &Cookie{}, &Message{})
if err != nil {
panic(err)
}
}
}
func GetLastMessages() ([]Message, error) {
var msgs []Message
err := db.Model(&msgs).Relation("User").Order("sent DESC").Limit(10).Select()
err := db.Preload("User").Order("sent DESC").Limit(10).Find(&msgs).Error
if err != nil {
return nil, err
}
......@@ -101,22 +61,25 @@ func GetLastMessages() ([]Message, error) {
return msgs, nil
}
func GetUser(r *http.Request) User {
func GetUser(r *http.Request) *User {
c, e := r.Cookie(cookiename)
if e != nil {
return User{}
return nil
}
cook := &Cookie{
Id: c.Value,
u, e := uuid.Parse(c.Value)
if e != nil {
return nil
}
e = db.Model(cook).WherePK().Relation("User").First()
cook := &Cookie{}
e = db.Preload("User").First(&cook, "id = ?", u).Error
if e != nil {
return User{}
return nil
}
return *cook.User
return cook.User
}
func Logout(w http.ResponseWriter, r *http.Request) {
......@@ -125,11 +88,8 @@ func Logout(w http.ResponseWriter, r *http.Request) {
return
}
cook := &Cookie{
Id: c.Value,
}
_, e = db.Model(cook).WherePK().Delete()
cook := &Cookie{}
e = db.Delete(&cook, "id = ?", c.Value).Error
http.Redirect(w, r, "/", http.StatusFound)
}
......@@ -137,7 +97,7 @@ func Logout(w http.ResponseWriter, r *http.Request) {
func SwitchTheme(w http.ResponseWriter, r *http.Request) {
u := GetUser(r)
u.Dark = !u.Dark
e := UpdateUser(&u)
e := UpdateUser(u)
if e != nil {
fmt.Println(e)
}
......@@ -145,7 +105,7 @@ func SwitchTheme(w http.ResponseWriter, r *http.Request) {
}
func UpdateUser(u *User) error {
_, e := db.Model(u).WherePK().Update()
e := db.Save(u).Error
return e
}
......@@ -157,25 +117,28 @@ func SaveUser(w http.ResponseWriter, name, schacc string) error {
Dark: true,
}
err := db.Model(u).WherePK().First()
tmp := &User{}
err := db.First(tmp, "SchAcc = ?", schacc).Error
if err != nil {
fmt.Println("new user", schacc)
_, err := db.Model(u).Insert()
err = db.Save(u).Error
if err != nil {
return err
}
} else {
u = tmp
}
c := &Cookie{User: u, SchAcc: schacc}
_, err = db.Model(c).Insert()
err = db.Save(c).Error
if err != nil {
return err
}
http.SetCookie(w, &http.Cookie{
Name: cookiename,
Value: c.Id,
Value: c.Id.String(),
Expires: time.Now().AddDate(1, 0, 0),
Path: "/",
})
......@@ -184,6 +147,6 @@ func SaveUser(w http.ResponseWriter, name, schacc string) error {
}
func SaveMsg(msg *Message) error {
_, e := db.Model(msg).Insert(msg)
e := db.Save(msg).Error
return e
}
......@@ -5,6 +5,13 @@ replace git.sch.bme.hu/mikewashere/voxfrontend => ./
go 1.15
require (
git.sch.bme.hu/mikewashere/authsch v0.0.0-20201209204841-3ea90fdecc24
github.com/go-pg/pg/v10 v10.7.3
git.sch.bme.hu/kszk/opensource/authsch-go v0.0.0-20210106155008-5255fc7dbbe4 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/uuid v1.3.0 // indirect
gitlab.com/MikeTTh/env v0.0.0-20210102155928-2e9be3823cc7 // indirect
golang.org/x/net v0.0.0-20211111083644-e5c967477495 // indirect
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect
google.golang.org/protobuf v1.27.1 // indirect
gorm.io/driver/postgres v1.2.1 // indirect
gorm.io/gorm v1.22.2 // indirect
)
This diff is collapsed.
......@@ -2,7 +2,7 @@ package main
import (
"fmt"
"git.sch.bme.hu/mikewashere/authsch"
"git.sch.bme.hu/kszk/opensource/authsch-go"
"git.sch.bme.hu/mikewashere/voxfrontend/api"
"git.sch.bme.hu/mikewashere/voxfrontend/db"
"git.sch.bme.hu/mikewashere/voxfrontend/mainpage"
......@@ -13,13 +13,13 @@ import (
var auth authsch.Client
func init() {
id := os.Getenv("ID")
id := os.Getenv("CLIENTID")
if id == "" {
panic("You must provide the ID env variable")
panic("You must provide the CLIENTID env variable")
}
secret := os.Getenv("SECRET")
secret := os.Getenv("CLIENTSECRET")
if secret == "" {
panic("You must provide the SECRET env variable")
panic("You must provide the CLIENTSECRET env variable")
}
auth = authsch.CreateClient(id, secret, []string{
"basic",
......
......@@ -2,7 +2,7 @@ package mainpage
import (
"fmt"
"git.sch.bme.hu/mikewashere/authsch"
"git.sch.bme.hu/kszk/opensource/authsch-go"
"git.sch.bme.hu/mikewashere/voxfrontend/db"
"git.sch.bme.hu/mikewashere/voxfrontend/languages"
"html/template"
......@@ -12,7 +12,7 @@ import (
var tmpl *template.Template
type indexData struct {
User db.User
User *db.User
LoginURL string
Langs []languages.Voice
DefLang languages.Voice
......
......@@ -6,7 +6,13 @@
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
</head>
<body class="{{ if .User.Dark }} bg-dark {{ end }}">
{{ $dark := false }}
{{ if .User }}
{{ if .User.Dark }}
{{ $dark = true }}
{{ end }}
{{ end }}
<body class="{{if $dark}}bg-dark{{end}}">
<div id="overlay">
<h2 class="text-white" style="margin-top: 50vh; width: 100%; text-align: center">
......@@ -34,7 +40,7 @@
}
</style>
<nav class="navbar navbar-expand-lg {{ if .User.Dark }} navbar-dark {{ else }} navbar-light {{ end }} bg-primary">
<nav class="navbar navbar-expand-lg {{ if $dark }} navbar-dark {{ else }} navbar-light {{ end }} bg-primary">
<a class="navbar-brand" href="#">Vox</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
......@@ -44,7 +50,7 @@
<a class="nav-link" href="/themeswitch/">Témaváltás</a>
</div>
<div class="navbar-nav">
{{ if .User.SchAcc }}
{{ if .User }}
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{{ .User.SchAcc }}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment