/app/controllers/gorm.go

https://github.com/gitDashboard/gitDashboard · Go · 146 lines · 130 code · 12 blank · 4 comment · 32 complexity · 4dfed6882a27c5f1a35b48ce881701a8 MD5 · raw file

  1. package controllers
  2. import (
  3. "database/sql"
  4. "github.com/gitDashboard/gitDashboard/app/models"
  5. _ "github.com/go-sql-driver/mysql"
  6. "github.com/jinzhu/gorm"
  7. _ "github.com/jinzhu/gorm/dialects/sqlite"
  8. _ "github.com/lib/pq"
  9. "github.com/revel/revel"
  10. "golang.org/x/crypto/bcrypt"
  11. "os"
  12. )
  13. var Db *gorm.DB
  14. type GormController struct {
  15. BasicController
  16. Tx *gorm.DB
  17. }
  18. func getDbReferences() (string, string) {
  19. var dbType, dbConnection string
  20. dbType, dbTypeFounded := revel.Config.String("db.type")
  21. dbConnection, dbConnectionFounded := revel.Config.String("db.connection")
  22. if !dbTypeFounded || !dbConnectionFounded {
  23. revel.WARN.Println("no settings found for database connection on revel configuration, searching on system environment (GITDASHBOARD_DBTYPE,GITDASHBOARD_DBCONNECTION)")
  24. //search on environment
  25. dbType = os.Getenv("GITDASHBOARD_DBTYPE")
  26. dbConnection = os.Getenv("GITDASHBOARD_DBCONNECTION")
  27. }
  28. if dbType == "" || dbConnection == "" {
  29. revel.ERROR.Println("No Database connection found")
  30. panic("No database connection found")
  31. }
  32. return dbType, dbConnection
  33. }
  34. func InitDB() {
  35. var err error
  36. dbtype, dbConnection := getDbReferences()
  37. Db, err = gorm.Open(dbtype, dbConnection)
  38. if err != nil {
  39. revel.ERROR.Println("FATAL", err)
  40. panic(err)
  41. }
  42. Db.LogMode(true)
  43. Db.DB().Ping()
  44. Db.DB().SetMaxIdleConns(10)
  45. Db.DB().SetMaxOpenConns(100)
  46. perm := &models.Permission{}
  47. user := &models.User{}
  48. repo := &models.Repo{}
  49. folder := &models.Folder{}
  50. event := &models.Event{}
  51. if !Db.HasTable(folder) {
  52. revel.INFO.Println("Creating folders table")
  53. Db.CreateTable(folder)
  54. } else {
  55. Db.AutoMigrate(folder)
  56. }
  57. if !Db.HasTable(repo) {
  58. revel.INFO.Println("Creating repos table")
  59. Db.CreateTable(repo)
  60. } else {
  61. Db.AutoMigrate(repo)
  62. }
  63. if !Db.HasTable(perm) {
  64. revel.INFO.Println("Creating permissions table")
  65. Db.CreateTable(perm)
  66. /*Db.Model(perm).AddForeignKey("repo_id", "repos(id)", "CASCADE", "RESTRICT")
  67. Db.Model(perm).AddForeignKey("user_id", "users(id)", "CASCADE", "RESTRICT")
  68. Db.Model(perm).AddForeignKey("group_id", "groups(id)", "CASCADE", "RESTRICT")*/
  69. } else {
  70. Db.AutoMigrate(perm)
  71. }
  72. if !Db.HasTable(user) {
  73. revel.INFO.Println("Creating users table")
  74. Db.CreateTable(user)
  75. Db.Table("users_permissions").AddForeignKey("permission_id", "permissions(id)", "CASCADE", "RESTRICT")
  76. Db.Table("users_permissions").AddForeignKey("user_id", "users(id)", "CASCADE", "RESTRICT")
  77. var adminPwdFld sql.NullString
  78. adminPwd, _ := bcrypt.GenerateFromPassword([]byte("admin"), bcrypt.DefaultCost)
  79. adminPwdFld.String = string(adminPwd)
  80. adminPwdFld.Valid = true
  81. adminUser := &models.User{Username: "admin", Type: "internal", Password: adminPwdFld, Name: "Admin user", Admin: true}
  82. Db.Create(adminUser)
  83. } else {
  84. Db.AutoMigrate(user)
  85. }
  86. if !Db.HasTable(event) {
  87. revel.INFO.Println("Creating events table")
  88. Db.CreateTable(event)
  89. } else {
  90. Db.AutoMigrate(event)
  91. }
  92. }
  93. func (c *GormController) NewTransaction() *gorm.DB {
  94. txn := Db.Begin()
  95. if txn.Error != nil {
  96. panic(txn.Error)
  97. }
  98. revel.INFO.Println("txn init", txn)
  99. return txn
  100. }
  101. func (c *GormController) RollbackTransaction(tx *gorm.DB) {
  102. if tx == nil {
  103. return
  104. }
  105. tx.Rollback()
  106. if err := tx.Error; err != nil && err != sql.ErrTxDone {
  107. panic(err)
  108. }
  109. revel.INFO.Println("tx rollbacked", tx)
  110. }
  111. func (c *GormController) CommitTransaction(tx *gorm.DB) {
  112. if tx == nil {
  113. return
  114. }
  115. tx.Commit()
  116. if err := tx.Error; err != nil && err != sql.ErrTxDone {
  117. panic(err)
  118. }
  119. revel.INFO.Println("tx commited", tx)
  120. }
  121. func (c *GormController) Begin() revel.Result {
  122. c.Tx = c.NewTransaction()
  123. return nil
  124. }
  125. func (c *GormController) Commit() revel.Result {
  126. c.CommitTransaction(c.Tx)
  127. c.Tx = nil
  128. return nil
  129. }
  130. func (c *GormController) Rollback() revel.Result {
  131. c.RollbackTransaction(c.Tx)
  132. c.Tx = nil
  133. return nil
  134. }