user.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package libamuse
  2. import (
  3. "notabug.org/apiote/amuse/accounts"
  4. "notabug.org/apiote/amuse/config"
  5. "notabug.org/apiote/amuse/db"
  6. "crypto/sha256"
  7. "encoding/base64"
  8. "errors"
  9. "io/ioutil"
  10. "notabug.org/apiote/gott"
  11. )
  12. type Avatar struct {
  13. Data []byte
  14. Mimetype string
  15. Etag string
  16. }
  17. func getUser(args ...interface{}) (interface{}, error) {
  18. request := args[0].(*RequestData)
  19. result := args[1].(*Result)
  20. user, err := db.GetUser(request.id)
  21. result.result = user
  22. return gott.Tuple(args), err
  23. }
  24. func getAvatar(args ...interface{}) (interface{}, error) {
  25. result := args[1].(*Result)
  26. small := args[2].(bool)
  27. user := result.result.(*db.User)
  28. if small {
  29. if string(user.AvatarSmall) == "" {
  30. return gott.Tuple(args), errors.New("No avatar")
  31. } else {
  32. result.result = user.AvatarSmall
  33. }
  34. } else {
  35. if string(user.Avatar) == "" {
  36. return gott.Tuple(args), errors.New("No avatar")
  37. } else {
  38. result.result = user.Avatar
  39. }
  40. }
  41. result.result2 = "image/webp"
  42. return gott.Tuple(args), nil
  43. }
  44. func checkEtag(args ...interface{}) (interface{}, error) {
  45. request := args[0].(*RequestData)
  46. result := args[1].(*Result)
  47. h := sha256.New()
  48. _, err := h.Write(result.result.([]byte))
  49. if err != nil {
  50. return gott.Tuple(args), err
  51. }
  52. etag := base64.StdEncoding.EncodeToString(h.Sum(nil))
  53. if etag == request.etag {
  54. result.result = []byte{}
  55. }
  56. result.page = etag
  57. return gott.Tuple(args), nil
  58. }
  59. func recovery(args ...interface{}) (interface{}, error) {
  60. err := args[3].(error)
  61. switch err.Error() {
  62. case "No avatar":
  63. return getPlaceholder(args...)
  64. default:
  65. return gott.Tuple(args), err
  66. }
  67. }
  68. func getPlaceholder(args ...interface{}) (interface{}, error) {
  69. result := args[1].(*Result)
  70. img, err := ioutil.ReadFile(config.DataHome + "/static/img/avatar.webp") // todo path
  71. result.result = img
  72. result.result2 = "image/webp"
  73. return gott.Tuple(args), err
  74. }
  75. func ShowUserAvatar(username, etagReq string, auth accounts.Authentication, small bool) (Avatar, error) {
  76. auth.Necessary = true
  77. avatar := Avatar{}
  78. r, err := gott.
  79. NewResult(gott.Tuple{&RequestData{id: username, etag: etagReq, auth: auth, username: username}, &Result{}, small}).
  80. Bind(verifyToken).
  81. Bind(verifyUser).
  82. Bind(getUser).
  83. Bind(getAvatar).
  84. Recover(recovery).
  85. Bind(checkEtag).
  86. Finish()
  87. if err != nil {
  88. return avatar, err
  89. }
  90. r = r.(gott.Tuple)[1]
  91. avatar.Data = r.(*Result).result.([]byte)
  92. avatar.Mimetype = r.(*Result).result2.(string)
  93. avatar.Etag = r.(*Result).page
  94. return avatar, nil
  95. }