package charakterin import ( "database/sql" "log" "net/http" _ "github.com/lib/pq" ) // Renderer wird verwendet, um die Routen (bspw. Login-Route) zu rendern. Damit bleibt Charakterin selbst ohne Template. type Renderer interface { // RenderLoginPage zeigt die Login-Seite an. RenderLoginPage(w http.ResponseWriter, data map[string]interface{}) } // Charakterin ist das tolle Login- und Accountmanagementsystem. type Charakterin struct { renderer Renderer FallbackRoute string Database *sql.DB } // New erstellt eine neue Instanz von Charakterin. func New(db *sql.DB) *Charakterin { if err := db.Ping(); err != nil { log.Fatalln("no valid database connection supplied:", err) return nil } return &Charakterin{ nil, "/", db, } } // UseRenderer sagt charakterin, welchen Renderer es benutzen soll. func (c *Charakterin) UseRenderer(renderer Renderer) { c.renderer = renderer } // DisplayLogin zeigt die Route für den Login an, wenn der User nicht bereits eingeloggt ist. func (c *Charakterin) DisplayLogin(w http.ResponseWriter, r *http.Request) { if c.IsLoggedIn(r) { http.Redirect(w, r, c.FallbackRoute, 302) return } if c.renderer == nil { log.Println("charakterin: no renderer set") return } http.SetCookie(w, &http.Cookie{ Name: "session", Value: "benis", }) c.renderer.RenderLoginPage(w, make(map[string]interface{})) } // Login versucht einen User einzuloggen. func (c *Charakterin) Login(w http.ResponseWriter, r *http.Request) { } // IsLoggedIn überprüft anhand eines Request, ob der User eingeloggt ist. func (c *Charakterin) IsLoggedIn(r *http.Request) bool { cookie, err := r.Cookie("session") if err != nil { log.Println("no session") return false } rows, err := c.Database.Query(`SELECT * FROM login.sessions WHERE id = $1`, cookie.Value) if err != nil { log.Println(err) return false } if rows.Next() { return true } return false }