common.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package libamuse
  2. import (
  3. "notabug.org/apiote/amuse/accounts"
  4. "notabug.org/apiote/amuse/front"
  5. "notabug.org/apiote/amuse/tmdb"
  6. "notabug.org/apiote/amuse/wikidata"
  7. "notabug.org/apiote/amuse/datastructure"
  8. "notabug.org/apiote/amuse/db"
  9. "database/sql"
  10. "errors"
  11. "golang.org/x/text/language"
  12. "notabug.org/apiote/gott"
  13. )
  14. type Data interface {
  15. getLanguage() string
  16. getMimeType() string
  17. getAuth() accounts.Authentication
  18. getReqUsername() string
  19. }
  20. func verifyToken(args ...interface{}) (interface{}, error) {
  21. data := args[0].(Data)
  22. result := args[1].(*Result)
  23. user, err := VerifyAuthToken(data.getAuth())
  24. if _, ok := err.(accounts.AuthError); ok && !data.getAuth().Necessary {
  25. err = nil
  26. }
  27. result.user = user
  28. return gott.Tuple(args), err
  29. }
  30. func verifyUser(args ...interface{}) (interface{}, error) {
  31. data := args[0].(Data)
  32. result := args[1].(*Result)
  33. if result.user.Username != data.getReqUsername() {
  34. return gott.Tuple(args), accounts.AuthError{Err: errors.New("403")}
  35. }
  36. return gott.Tuple(args), nil
  37. }
  38. func createDbConnection(args ...interface{}) (interface{}, error) {
  39. requestData := args[0].(*RequestData)
  40. db, err := sql.Open("sqlite3", "./amuse.db")
  41. if err != nil {
  42. return gott.Tuple(args), err
  43. }
  44. requestData.connection = db
  45. return gott.Tuple(args), nil
  46. }
  47. func parseLanguage(args ...interface{}) (interface{}, error) {
  48. data := args[0].(Data)
  49. result := args[1].(*Result)
  50. tags, _, err := language.ParseAcceptLanguage(data.getLanguage())
  51. if tags == nil {
  52. tags = []language.Tag{}
  53. }
  54. if len(tags) == 0 {
  55. tags = append(tags, language.Make("en-GB"))
  56. }
  57. result.languages = tags
  58. return gott.Tuple(args), err
  59. }
  60. func createRenderer(args ...interface{}) (interface{}, error) {
  61. data := args[0].(Data)
  62. result := args[1].(*Result)
  63. renderer, err := front.NewRenderer(data.getMimeType(), result.user)
  64. result.renderer = renderer
  65. return gott.Tuple(args), err
  66. }
  67. func getDescription(args ...interface{}) (interface{}, error) {
  68. data := args[0].(*RequestData)
  69. result := args[1].(*Result)
  70. work := result.result.(wikidata.Work)
  71. languages := result.languages
  72. description, err := wikidata.GetWorkDescription(work.GetArticle(), languages[0].String(), data.connection)
  73. work.SetDescription(description)
  74. return gott.Tuple(args), err
  75. }
  76. func getBasedOn(args ...interface{}) (interface{}, error) {
  77. data := args[0].(*RequestData)
  78. result := args[1].(*Result)
  79. show := result.result.(tmdb.Show)
  80. languages := result.languages
  81. book, err := wikidata.GetBookByTmdb(data.id, languages[0].String())
  82. show.AddBasedOn(book)
  83. return gott.Tuple(args), err
  84. }
  85. func getGenres(args ...interface{}) (interface{}, error) {
  86. result := args[1].(*Result)
  87. list := result.result.(datastructure.List)
  88. genres, err := tmdb.GetGenres(result.languages[0].String(), list.GetType())
  89. list.SetGenres(genres)
  90. result.result = list
  91. return gott.Tuple(args), err
  92. }
  93. func isOnWantList(args ...interface{}) (interface{}, error) {
  94. data := args[0].(*RequestData)
  95. result := args[1].(*Result)
  96. show := result.result.(tmdb.Show)
  97. if result.user.IsEmpty() {
  98. return gott.Tuple(args), nil
  99. }
  100. itemType := tmdb.GetItemTypeFromShow(show)
  101. isOnList, err := db.IsOnWantList(result.user.Username, data.id, itemType)
  102. show.SetOnWantList(isOnList)
  103. return gott.Tuple(args), err
  104. }
  105. func updateCache(args ...interface{}) (interface{}, error) {
  106. data := args[0].(*RequestData)
  107. result := args[1].(*Result)
  108. item := result.result.(datastructure.Item)
  109. itemInfo := item.GetItemInfo()
  110. err := db.UpdateCacheItem(item.GetItemType(), data.id, itemInfo)
  111. return gott.Tuple(args), err
  112. }
  113. type RequestData struct {
  114. id string
  115. etag string
  116. connection *sql.DB
  117. language string
  118. mimetype string
  119. code int
  120. auth accounts.Authentication
  121. username string
  122. }
  123. type Result struct {
  124. languages []language.Tag
  125. renderer front.Renderer
  126. user accounts.User
  127. result interface{}
  128. result2 interface{} // todo this is ugly -> to []interface{} with .result
  129. page string
  130. }
  131. func (d RequestData) getLanguage() string {
  132. return d.language
  133. }
  134. func (d RequestData) getMimeType() string {
  135. return d.mimetype
  136. }
  137. func (d RequestData) getAuth() accounts.Authentication {
  138. return d.auth
  139. }
  140. func (d RequestData) getReqUsername() string {
  141. return d.username
  142. }