DB Caching mechanism working and final service structure
This commit is contained in:
parent
11eed92c15
commit
df822d6ff9
@ -2,9 +2,9 @@ package controllers
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"multitenantStack/models"
|
"multitenantStack/models"
|
||||||
companydb "multitenantStack/services/companydbservice"
|
companydb "multitenantStack/services/companydb"
|
||||||
|
|
||||||
jwtservice "multitenantStack/services/jwtservice"
|
tokenTools "multitenantStack/services/tokenTools"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/astaxie/beego/orm"
|
"github.com/astaxie/beego/orm"
|
||||||
@ -36,8 +36,9 @@ func (c *AuthController) URLMapping() {
|
|||||||
func (c *AuthController) Login() {
|
func (c *AuthController) Login() {
|
||||||
|
|
||||||
type AuthResponse struct {
|
type AuthResponse struct {
|
||||||
Status int
|
Status int `json:"status"`
|
||||||
Jwt string
|
Jwt string `json:"jwt"`
|
||||||
|
User models.CompanyUser `json:"user"`
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.Ctx.Input.Method() != "POST" {
|
if c.Ctx.Input.Method() != "POST" {
|
||||||
@ -47,7 +48,7 @@ func (c *AuthController) Login() {
|
|||||||
|
|
||||||
tokenHeader := c.Ctx.Request.Header.Get("X-JWTtoken")
|
tokenHeader := c.Ctx.Request.Header.Get("X-JWTtoken")
|
||||||
if tokenHeader != "" {
|
if tokenHeader != "" {
|
||||||
valid, _ := jwtservice.Validate(tokenHeader)
|
valid, _ := tokenTools.Validate(tokenHeader)
|
||||||
if valid {
|
if valid {
|
||||||
c.ServeJSONError("You are already logged in")
|
c.ServeJSONError("You are already logged in")
|
||||||
return
|
return
|
||||||
@ -61,7 +62,7 @@ func (c *AuthController) Login() {
|
|||||||
c.ServeJSONError("Email/Password missing")
|
c.ServeJSONError("Email/Password missing")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
systemdb := companydb.GetSystemDatabase()
|
systemdb := companydb.GetSystemDatabase()
|
||||||
|
|
||||||
if systemdb == nil {
|
if systemdb == nil {
|
||||||
@ -73,9 +74,6 @@ func (c *AuthController) Login() {
|
|||||||
c.ServeJSONError("Error retrieving User")
|
c.ServeJSONError("Error retrieving User")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
o := orm.NewOrm()
|
|
||||||
o.Using("system") //TODO: Replace this with something cleverer (manager) once implemented
|
|
||||||
|
|
||||||
userCompanyMapping, err := models.GetUserCompanyMapByEmail(o, email)
|
userCompanyMapping, err := models.GetUserCompanyMapByEmail(o, email)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -109,20 +107,13 @@ func (c *AuthController) Login() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: if found query the company database to get roleID, and name
|
|
||||||
|
|
||||||
name := companyUser.Name
|
|
||||||
roleID := companyUser.Role
|
|
||||||
|
|
||||||
tokenString := ""
|
tokenString := ""
|
||||||
if email == "admin@admin.at" && password == "my password" {
|
if email == "admin@admin.at" && password == "my password" {
|
||||||
// The jwtClaims are our trusted clientside session
|
// The jwtClaims are our trusted clientside session
|
||||||
tokenString = jwtservice.CreateToken(jwt.MapClaims{
|
tokenString = tokenTools.CreateToken(jwt.MapClaims{
|
||||||
"email": email,
|
"email": email,
|
||||||
"companyName": companyName,
|
"companyName": companyName,
|
||||||
"companyUserID": companyUserID,
|
"companyUserID": companyUserID,
|
||||||
"name": name,
|
|
||||||
"roleID": roleID,
|
|
||||||
"exp": time.Now().Unix() + 3600,
|
"exp": time.Now().Unix() + 3600,
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
@ -130,7 +121,7 @@ func (c *AuthController) Login() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
json := AuthResponse{200, tokenString}
|
json := AuthResponse{200, tokenString, *companyUser}
|
||||||
c.Data["json"] = &json
|
c.Data["json"] = &json
|
||||||
|
|
||||||
c.ServeJSON()
|
c.ServeJSON()
|
||||||
|
@ -3,7 +3,7 @@ package controllers
|
|||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"fmt"
|
"fmt"
|
||||||
companydb "multitenantStack/services/companydbservice"
|
companydb "multitenantStack/services/companydb"
|
||||||
|
|
||||||
"github.com/astaxie/beego/orm"
|
"github.com/astaxie/beego/orm"
|
||||||
jwt "github.com/dgrijalva/jwt-go"
|
jwt "github.com/dgrijalva/jwt-go"
|
||||||
|
@ -1 +1 @@
|
|||||||
{"/Users/LB/go/src/multitenantStack/controllers":1541629384273036460}
|
{"/Users/LB/go/src/multitenantStack/controllers":1541672200497550656}
|
8
main.go
8
main.go
@ -2,8 +2,8 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
_ "multitenantStack/routers"
|
_ "multitenantStack/routers"
|
||||||
companydb "multitenantStack/services/companydbservice"
|
companydb "multitenantStack/services/companydb"
|
||||||
jwt "multitenantStack/services/jwtservice"
|
tokenTools "multitenantStack/services/tokenTools"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/astaxie/beego"
|
"github.com/astaxie/beego"
|
||||||
@ -15,8 +15,8 @@ func init() {
|
|||||||
orm.RegisterDataBase("default", "postgres", "host=127.0.0.1 port=5435 user=postgres password=postgre sslmode=disable")
|
orm.RegisterDataBase("default", "postgres", "host=127.0.0.1 port=5435 user=postgres password=postgre sslmode=disable")
|
||||||
orm.RegisterDataBase("system", "postgres", "host=127.0.0.1 port=5435 user=postgres password=postgre dbname=system sslmode=disable")
|
orm.RegisterDataBase("system", "postgres", "host=127.0.0.1 port=5435 user=postgres password=postgre dbname=system sslmode=disable")
|
||||||
|
|
||||||
jwt.InitJWTService()
|
tokenTools.InitTokenToolsService()
|
||||||
companydb.InitCompanyService()
|
companydb.InitCompanyDBService()
|
||||||
orm.DefaultTimeLoc = time.UTC
|
orm.DefaultTimeLoc = time.UTC
|
||||||
if beego.BConfig.RunMode == "dev" {
|
if beego.BConfig.RunMode == "dev" {
|
||||||
beego.BConfig.WebConfig.DirectoryIndex = true
|
beego.BConfig.WebConfig.DirectoryIndex = true
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
package companydbservice
|
package companydb
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"multitenantStack/services/jwtservice"
|
tokenTools "multitenantStack/services/tokenTools"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
jwt "github.com/dgrijalva/jwt-go"
|
jwt "github.com/dgrijalva/jwt-go"
|
||||||
@ -12,10 +12,9 @@ import (
|
|||||||
|
|
||||||
var dbs map[string]*sql.DB
|
var dbs map[string]*sql.DB
|
||||||
|
|
||||||
// InitCompanyService Init companydb service and open system db connection
|
// InitCompanyDBService Init companydb service and open system db connection
|
||||||
func InitCompanyService() {
|
func InitCompanyDBService() {
|
||||||
fmt.Println("Hello from init") // test if init gets called from each orm
|
dbs = make(map[string]*sql.DB)
|
||||||
dbs := make(map[string]*sql.DB)
|
|
||||||
|
|
||||||
systemDB, err := sql.Open("postgres", "host=127.0.0.1 port=5435 user=postgres password=postgre dbname=system sslmode=disable")
|
systemDB, err := sql.Open("postgres", "host=127.0.0.1 port=5435 user=postgres password=postgre dbname=system sslmode=disable")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -23,30 +22,28 @@ func InitCompanyService() {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
dbs["system"] = systemDB
|
dbs["system"] = systemDB
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetSystemDatabase returns system db
|
// GetSystemDatabase returns system db
|
||||||
func GetSystemDatabase() *sql.DB {
|
func GetSystemDatabase() *sql.DB {
|
||||||
|
fmt.Println(dbs)
|
||||||
return dbs["system"]
|
return dbs["system"]
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetDatabase Get orm and user information
|
// GetDatabase Get orm and user information
|
||||||
func GetDatabaseWithName(companyName string) (*sql.DB, error) {
|
func GetDatabaseWithName(companyName string) (*sql.DB, error) {
|
||||||
|
|
||||||
if dbs[companyName] != nil {
|
if dbs[companyName] != nil {
|
||||||
fmt.Println("DB Already open")
|
fmt.Println("DB Already open")
|
||||||
return dbs[companyName], nil
|
return dbs[companyName], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
conStr := fmt.Sprintf("host=127.0.0.1 port=5435 user=postgres password=postgre dbname=%s sslmode=disable", companyName)
|
conStr := fmt.Sprintf("host=127.0.0.1 port=5435 user=postgres password=postgre dbname=%s sslmode=disable", companyName)
|
||||||
fmt.Println(conStr)
|
|
||||||
db, err := sql.Open("postgres", conStr)
|
db, err := sql.Open("postgres", conStr)
|
||||||
|
dbs[companyName] = db
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// return db with orm or error
|
|
||||||
return db, nil
|
return db, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,7 +51,7 @@ func GetDatabaseWithName(companyName string) (*sql.DB, error) {
|
|||||||
// GetDatabase Get orm and user information
|
// GetDatabase Get orm and user information
|
||||||
func GetDatabase(tokenString string) (jwt.MapClaims, *sql.DB, error) {
|
func GetDatabase(tokenString string) (jwt.MapClaims, *sql.DB, error) {
|
||||||
// validate token
|
// validate token
|
||||||
valid, token := jwtservice.Validate(tokenString)
|
valid, token := tokenTools.Validate(tokenString)
|
||||||
if !valid {
|
if !valid {
|
||||||
return nil, nil, errors.New("Token is invalid")
|
return nil, nil, errors.New("Token is invalid")
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package jwtservice
|
package tokenTools
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
@ -17,7 +17,7 @@ func GenerateSecret() []byte {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// InitJWTService generate the secret to verify JWTs and store it in memory
|
// InitJWTService generate the secret to verify JWTs and store it in memory
|
||||||
func InitJWTService() {
|
func InitTokenToolsService() {
|
||||||
hmacSecret = GenerateSecret()
|
hmacSecret = GenerateSecret()
|
||||||
fmt.Println("InitJWTService", hmacSecret)
|
fmt.Println("InitJWTService", hmacSecret)
|
||||||
// TODO: This needs to be replaced with reading rsa keys, there needs to be a automatic generation of these if they do not exist
|
// TODO: This needs to be replaced with reading rsa keys, there needs to be a automatic generation of these if they do not exist
|
Loading…
Reference in New Issue
Block a user