errorhelpers.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package errorhelpers
  2. import (
  3. "fmt"
  4. "errors"
  5. "git.mmnx.de/Moe/templatehelpers"
  6. "github.com/kataras/iris"
  7. )
  8. const (
  9. // Error levels
  10. ERR_NO_ERR = -1
  11. ERR_LVL_INFORMATION = 0
  12. ERR_LVL_WARNING = 1
  13. ERR_LVL_ERROR = 2
  14. ERR_LVL_FATAL = 3
  15. // User errors
  16. ERR_USER_NOT_FOUND = "ERR_USER_NOT_FOUND"
  17. ERR_PASSWORD_MISMATCH = "ERR_PASSWORD_MISMATCH"
  18. ERR_SESSION_TIMED_OUT = "ERR_SESSION_TIMED_OUT"
  19. ERR_INVALID_TOKEN = "ERR_INVALID_TOKEN"
  20. ERR_USERNAME_TAKEN = "ERR_USERNAME_TAKEN"
  21. ERR_INVALID_PARAM = "ERR_INVALID_PARAM"
  22. ERR_NO_CHANGES = "ERR_NO_CHANGES"
  23. SUCCESS_LOGIN = "SUCCESS_LOGIN"
  24. SUCCESS_LOGOUT = "SUCCESS_LOGOUT"
  25. SUCCESS_UPDATE = "SUCCESS_UPDATE"
  26. SUCCESS_REGISTER = "SUCCESS_REGISTER"
  27. SUCCESS_TOKENS_GENERATED = "SUCCESS_TOKENS_GENERATED"
  28. )
  29. type Error struct {
  30. err error
  31. errLvl int
  32. }
  33. func(err Error) getErrLvl() int {
  34. return err.errLvl
  35. }
  36. func(err Error) getError() error {
  37. return err.err
  38. }
  39. func MakeError(e interface{}) Error {
  40. if e == nil { // check if it's an error
  41. return Error{nil, ERR_NO_ERR}
  42. }
  43. var err error
  44. var logLvl int
  45. // test for input type
  46. if v, isError := e.(error); isError {
  47. err = v
  48. } else if v, isString := e.(string); isString {
  49. err = errors.New(v)
  50. } else {
  51. fmt.Printf("Error Type not implemented: %T", e)
  52. DebugVar(e)
  53. DebugVar(&e)
  54. }
  55. switch err.Error() { // TODO: starts with ?
  56. case SUCCESS_LOGIN, SUCCESS_LOGOUT, SUCCESS_TOKENS_GENERATED, SUCCESS_UPDATE, SUCCESS_REGISTER:
  57. logLvl = ERR_LVL_INFORMATION
  58. default:
  59. logLvl = ERR_LVL_ERROR
  60. }
  61. return Error{err, logLvl}
  62. }
  63. func DebugVar(v interface{}) {
  64. fmt.Printf("%#v\n", v)
  65. }
  66. func HandleError(e interface{}, ctx *iris.Context) {
  67. err := MakeError(e)
  68. params := ctx.Get("params").(map[string]string)
  69. if err.getError() == nil { // if no error ..., TODO clean this up
  70. if len(params["notification"]) < 1 { // if we got one, show a notification
  71. ctx.Next() // ... execute next middleware
  72. return
  73. } else {
  74. err = MakeError(params["notification"]) // copy so that we dont get a nil pointer later
  75. }
  76. }
  77. params["notification"] = err.getError().Error() // TODO human readable
  78. params["notificationType"] = fmt.Sprintf("%d", err.getErrLvl())
  79. /** Some errors need to be 'redirected' **/
  80. switch err.getError().Error() {
  81. case SUCCESS_LOGIN: // open home after login
  82. params["reqDir"] = "home"
  83. case SUCCESS_LOGOUT, ERR_SESSION_TIMED_OUT, ERR_INVALID_TOKEN:
  84. params["reqDir"] = "login"
  85. }
  86. ctx.Set("params", params)
  87. switch err.getErrLvl() {
  88. case ERR_LVL_INFORMATION:
  89. templatehelpers.ShowNotification(ctx) // TODO: information custom color
  90. case ERR_LVL_WARNING:
  91. templatehelpers.ShowError(ctx)
  92. case ERR_LVL_ERROR:
  93. templatehelpers.ShowError(ctx)
  94. default:
  95. fmt.Print("Not implemented yet: ")
  96. ctx.StopExecution()
  97. DebugVar(err)
  98. }
  99. }