4
0

integration.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package form // import "miniflux.app/v2/internal/ui/form"
  4. import (
  5. "net/http"
  6. "strconv"
  7. "miniflux.app/v2/internal/model"
  8. )
  9. // IntegrationForm represents user integration settings form.
  10. type IntegrationForm struct {
  11. PinboardEnabled bool
  12. PinboardToken string
  13. PinboardTags string
  14. PinboardMarkAsUnread bool
  15. InstapaperEnabled bool
  16. InstapaperUsername string
  17. InstapaperPassword string
  18. FeverEnabled bool
  19. FeverUsername string
  20. FeverPassword string
  21. GoogleReaderEnabled bool
  22. GoogleReaderUsername string
  23. GoogleReaderPassword string
  24. WallabagEnabled bool
  25. WallabagOnlyURL bool
  26. WallabagURL string
  27. WallabagClientID string
  28. WallabagClientSecret string
  29. WallabagUsername string
  30. WallabagPassword string
  31. NotionEnabled bool
  32. NotionPageID string
  33. NotionToken string
  34. NunuxKeeperEnabled bool
  35. NunuxKeeperURL string
  36. NunuxKeeperAPIKey string
  37. EspialEnabled bool
  38. EspialURL string
  39. EspialAPIKey string
  40. EspialTags string
  41. ReadwiseEnabled bool
  42. ReadwiseAPIKey string
  43. PocketEnabled bool
  44. PocketAccessToken string
  45. PocketConsumerKey string
  46. TelegramBotEnabled bool
  47. TelegramBotToken string
  48. TelegramBotChatID string
  49. TelegramBotTopicID *int64
  50. TelegramBotDisableWebPagePreview bool
  51. TelegramBotDisableNotification bool
  52. TelegramBotDisableButtons bool
  53. LinkAceEnabled bool
  54. LinkAceURL string
  55. LinkAceAPIKey string
  56. LinkAceTags string
  57. LinkAcePrivate bool
  58. LinkAceCheckDisabled bool
  59. LinkdingEnabled bool
  60. LinkdingURL string
  61. LinkdingAPIKey string
  62. LinkdingTags string
  63. LinkdingMarkAsUnread bool
  64. LinkwardenEnabled bool
  65. LinkwardenURL string
  66. LinkwardenAPIKey string
  67. MatrixBotEnabled bool
  68. MatrixBotUser string
  69. MatrixBotPassword string
  70. MatrixBotURL string
  71. MatrixBotChatID string
  72. AppriseEnabled bool
  73. AppriseURL string
  74. AppriseServicesURL string
  75. ReadeckEnabled bool
  76. ReadeckURL string
  77. ReadeckAPIKey string
  78. ReadeckLabels string
  79. ReadeckOnlyURL bool
  80. ShioriEnabled bool
  81. ShioriURL string
  82. ShioriUsername string
  83. ShioriPassword string
  84. ShaarliEnabled bool
  85. ShaarliURL string
  86. ShaarliAPISecret string
  87. WebhookEnabled bool
  88. WebhookURL string
  89. WebhookSecret string
  90. RSSBridgeEnabled bool
  91. RSSBridgeURL string
  92. OmnivoreEnabled bool
  93. OmnivoreAPIKey string
  94. OmnivoreURL string
  95. RaindropEnabled bool
  96. RaindropToken string
  97. RaindropCollectionID string
  98. RaindropTags string
  99. BetulaEnabled bool
  100. BetulaURL string
  101. BetulaToken string
  102. NtfyEnabled bool
  103. NtfyTopic string
  104. NtfyURL string
  105. NtfyAPIToken string
  106. NtfyUsername string
  107. NtfyPassword string
  108. NtfyIconURL string
  109. }
  110. // Merge copy form values to the model.
  111. func (i IntegrationForm) Merge(integration *model.Integration) {
  112. integration.PinboardEnabled = i.PinboardEnabled
  113. integration.PinboardToken = i.PinboardToken
  114. integration.PinboardTags = i.PinboardTags
  115. integration.PinboardMarkAsUnread = i.PinboardMarkAsUnread
  116. integration.InstapaperEnabled = i.InstapaperEnabled
  117. integration.InstapaperUsername = i.InstapaperUsername
  118. integration.InstapaperPassword = i.InstapaperPassword
  119. integration.FeverEnabled = i.FeverEnabled
  120. integration.FeverUsername = i.FeverUsername
  121. integration.GoogleReaderEnabled = i.GoogleReaderEnabled
  122. integration.GoogleReaderUsername = i.GoogleReaderUsername
  123. integration.WallabagEnabled = i.WallabagEnabled
  124. integration.WallabagOnlyURL = i.WallabagOnlyURL
  125. integration.WallabagURL = i.WallabagURL
  126. integration.WallabagClientID = i.WallabagClientID
  127. integration.WallabagClientSecret = i.WallabagClientSecret
  128. integration.WallabagUsername = i.WallabagUsername
  129. integration.WallabagPassword = i.WallabagPassword
  130. integration.NotionEnabled = i.NotionEnabled
  131. integration.NotionPageID = i.NotionPageID
  132. integration.NotionToken = i.NotionToken
  133. integration.NunuxKeeperEnabled = i.NunuxKeeperEnabled
  134. integration.NunuxKeeperURL = i.NunuxKeeperURL
  135. integration.NunuxKeeperAPIKey = i.NunuxKeeperAPIKey
  136. integration.EspialEnabled = i.EspialEnabled
  137. integration.EspialURL = i.EspialURL
  138. integration.EspialAPIKey = i.EspialAPIKey
  139. integration.EspialTags = i.EspialTags
  140. integration.ReadwiseEnabled = i.ReadwiseEnabled
  141. integration.ReadwiseAPIKey = i.ReadwiseAPIKey
  142. integration.PocketEnabled = i.PocketEnabled
  143. integration.PocketAccessToken = i.PocketAccessToken
  144. integration.PocketConsumerKey = i.PocketConsumerKey
  145. integration.TelegramBotEnabled = i.TelegramBotEnabled
  146. integration.TelegramBotToken = i.TelegramBotToken
  147. integration.TelegramBotChatID = i.TelegramBotChatID
  148. integration.TelegramBotTopicID = i.TelegramBotTopicID
  149. integration.TelegramBotDisableWebPagePreview = i.TelegramBotDisableWebPagePreview
  150. integration.TelegramBotDisableNotification = i.TelegramBotDisableNotification
  151. integration.TelegramBotDisableButtons = i.TelegramBotDisableButtons
  152. integration.LinkAceEnabled = i.LinkAceEnabled
  153. integration.LinkAceURL = i.LinkAceURL
  154. integration.LinkAceAPIKey = i.LinkAceAPIKey
  155. integration.LinkAceTags = i.LinkAceTags
  156. integration.LinkAcePrivate = i.LinkAcePrivate
  157. integration.LinkAceCheckDisabled = i.LinkAceCheckDisabled
  158. integration.LinkdingEnabled = i.LinkdingEnabled
  159. integration.LinkdingURL = i.LinkdingURL
  160. integration.LinkdingAPIKey = i.LinkdingAPIKey
  161. integration.LinkdingTags = i.LinkdingTags
  162. integration.LinkdingMarkAsUnread = i.LinkdingMarkAsUnread
  163. integration.LinkwardenEnabled = i.LinkwardenEnabled
  164. integration.LinkwardenURL = i.LinkwardenURL
  165. integration.LinkwardenAPIKey = i.LinkwardenAPIKey
  166. integration.MatrixBotEnabled = i.MatrixBotEnabled
  167. integration.MatrixBotUser = i.MatrixBotUser
  168. integration.MatrixBotPassword = i.MatrixBotPassword
  169. integration.MatrixBotURL = i.MatrixBotURL
  170. integration.MatrixBotChatID = i.MatrixBotChatID
  171. integration.AppriseEnabled = i.AppriseEnabled
  172. integration.AppriseServicesURL = i.AppriseServicesURL
  173. integration.AppriseURL = i.AppriseURL
  174. integration.ReadeckEnabled = i.ReadeckEnabled
  175. integration.ReadeckURL = i.ReadeckURL
  176. integration.ReadeckAPIKey = i.ReadeckAPIKey
  177. integration.ReadeckLabels = i.ReadeckLabels
  178. integration.ReadeckOnlyURL = i.ReadeckOnlyURL
  179. integration.ShioriEnabled = i.ShioriEnabled
  180. integration.ShioriURL = i.ShioriURL
  181. integration.ShioriUsername = i.ShioriUsername
  182. integration.ShioriPassword = i.ShioriPassword
  183. integration.ShaarliEnabled = i.ShaarliEnabled
  184. integration.ShaarliURL = i.ShaarliURL
  185. integration.ShaarliAPISecret = i.ShaarliAPISecret
  186. integration.WebhookEnabled = i.WebhookEnabled
  187. integration.WebhookURL = i.WebhookURL
  188. integration.RSSBridgeEnabled = i.RSSBridgeEnabled
  189. integration.RSSBridgeURL = i.RSSBridgeURL
  190. integration.OmnivoreEnabled = i.OmnivoreEnabled
  191. integration.OmnivoreAPIKey = i.OmnivoreAPIKey
  192. integration.OmnivoreURL = i.OmnivoreURL
  193. integration.RaindropEnabled = i.RaindropEnabled
  194. integration.RaindropToken = i.RaindropToken
  195. integration.RaindropCollectionID = i.RaindropCollectionID
  196. integration.RaindropTags = i.RaindropTags
  197. integration.BetulaEnabled = i.BetulaEnabled
  198. integration.BetulaURL = i.BetulaURL
  199. integration.BetulaToken = i.BetulaToken
  200. integration.NtfyEnabled = i.NtfyEnabled
  201. integration.NtfyTopic = i.NtfyTopic
  202. integration.NtfyURL = i.NtfyURL
  203. integration.NtfyAPIToken = i.NtfyAPIToken
  204. integration.NtfyUsername = i.NtfyUsername
  205. integration.NtfyPassword = i.NtfyPassword
  206. integration.NtfyIconURL = i.NtfyIconURL
  207. }
  208. // NewIntegrationForm returns a new IntegrationForm.
  209. func NewIntegrationForm(r *http.Request) *IntegrationForm {
  210. return &IntegrationForm{
  211. PinboardEnabled: r.FormValue("pinboard_enabled") == "1",
  212. PinboardToken: r.FormValue("pinboard_token"),
  213. PinboardTags: r.FormValue("pinboard_tags"),
  214. PinboardMarkAsUnread: r.FormValue("pinboard_mark_as_unread") == "1",
  215. InstapaperEnabled: r.FormValue("instapaper_enabled") == "1",
  216. InstapaperUsername: r.FormValue("instapaper_username"),
  217. InstapaperPassword: r.FormValue("instapaper_password"),
  218. FeverEnabled: r.FormValue("fever_enabled") == "1",
  219. FeverUsername: r.FormValue("fever_username"),
  220. FeverPassword: r.FormValue("fever_password"),
  221. GoogleReaderEnabled: r.FormValue("googlereader_enabled") == "1",
  222. GoogleReaderUsername: r.FormValue("googlereader_username"),
  223. GoogleReaderPassword: r.FormValue("googlereader_password"),
  224. WallabagEnabled: r.FormValue("wallabag_enabled") == "1",
  225. WallabagOnlyURL: r.FormValue("wallabag_only_url") == "1",
  226. WallabagURL: r.FormValue("wallabag_url"),
  227. WallabagClientID: r.FormValue("wallabag_client_id"),
  228. WallabagClientSecret: r.FormValue("wallabag_client_secret"),
  229. WallabagUsername: r.FormValue("wallabag_username"),
  230. WallabagPassword: r.FormValue("wallabag_password"),
  231. NotionEnabled: r.FormValue("notion_enabled") == "1",
  232. NotionPageID: r.FormValue("notion_page_id"),
  233. NotionToken: r.FormValue("notion_token"),
  234. NunuxKeeperEnabled: r.FormValue("nunux_keeper_enabled") == "1",
  235. NunuxKeeperURL: r.FormValue("nunux_keeper_url"),
  236. NunuxKeeperAPIKey: r.FormValue("nunux_keeper_api_key"),
  237. EspialEnabled: r.FormValue("espial_enabled") == "1",
  238. EspialURL: r.FormValue("espial_url"),
  239. EspialAPIKey: r.FormValue("espial_api_key"),
  240. EspialTags: r.FormValue("espial_tags"),
  241. ReadwiseEnabled: r.FormValue("readwise_enabled") == "1",
  242. ReadwiseAPIKey: r.FormValue("readwise_api_key"),
  243. PocketEnabled: r.FormValue("pocket_enabled") == "1",
  244. PocketAccessToken: r.FormValue("pocket_access_token"),
  245. PocketConsumerKey: r.FormValue("pocket_consumer_key"),
  246. TelegramBotEnabled: r.FormValue("telegram_bot_enabled") == "1",
  247. TelegramBotToken: r.FormValue("telegram_bot_token"),
  248. TelegramBotChatID: r.FormValue("telegram_bot_chat_id"),
  249. TelegramBotTopicID: optionalInt64Field(r.FormValue("telegram_bot_topic_id")),
  250. TelegramBotDisableWebPagePreview: r.FormValue("telegram_bot_disable_web_page_preview") == "1",
  251. TelegramBotDisableNotification: r.FormValue("telegram_bot_disable_notification") == "1",
  252. TelegramBotDisableButtons: r.FormValue("telegram_bot_disable_buttons") == "1",
  253. LinkAceEnabled: r.FormValue("linkace_enabled") == "1",
  254. LinkAceURL: r.FormValue("linkace_url"),
  255. LinkAceAPIKey: r.FormValue("linkace_api_key"),
  256. LinkAceTags: r.FormValue("linkace_tags"),
  257. LinkAcePrivate: r.FormValue("linkace_is_private") == "1",
  258. LinkAceCheckDisabled: r.FormValue("linkace_check_disabled") == "1",
  259. LinkdingEnabled: r.FormValue("linkding_enabled") == "1",
  260. LinkdingURL: r.FormValue("linkding_url"),
  261. LinkdingAPIKey: r.FormValue("linkding_api_key"),
  262. LinkdingTags: r.FormValue("linkding_tags"),
  263. LinkdingMarkAsUnread: r.FormValue("linkding_mark_as_unread") == "1",
  264. LinkwardenEnabled: r.FormValue("linkwarden_enabled") == "1",
  265. LinkwardenURL: r.FormValue("linkwarden_url"),
  266. LinkwardenAPIKey: r.FormValue("linkwarden_api_key"),
  267. MatrixBotEnabled: r.FormValue("matrix_bot_enabled") == "1",
  268. MatrixBotUser: r.FormValue("matrix_bot_user"),
  269. MatrixBotPassword: r.FormValue("matrix_bot_password"),
  270. MatrixBotURL: r.FormValue("matrix_bot_url"),
  271. MatrixBotChatID: r.FormValue("matrix_bot_chat_id"),
  272. AppriseEnabled: r.FormValue("apprise_enabled") == "1",
  273. AppriseURL: r.FormValue("apprise_url"),
  274. AppriseServicesURL: r.FormValue("apprise_services_url"),
  275. ReadeckEnabled: r.FormValue("readeck_enabled") == "1",
  276. ReadeckURL: r.FormValue("readeck_url"),
  277. ReadeckAPIKey: r.FormValue("readeck_api_key"),
  278. ReadeckLabels: r.FormValue("readeck_labels"),
  279. ReadeckOnlyURL: r.FormValue("readeck_only_url") == "1",
  280. ShioriEnabled: r.FormValue("shiori_enabled") == "1",
  281. ShioriURL: r.FormValue("shiori_url"),
  282. ShioriUsername: r.FormValue("shiori_username"),
  283. ShioriPassword: r.FormValue("shiori_password"),
  284. ShaarliEnabled: r.FormValue("shaarli_enabled") == "1",
  285. ShaarliURL: r.FormValue("shaarli_url"),
  286. ShaarliAPISecret: r.FormValue("shaarli_api_secret"),
  287. WebhookEnabled: r.FormValue("webhook_enabled") == "1",
  288. WebhookURL: r.FormValue("webhook_url"),
  289. RSSBridgeEnabled: r.FormValue("rssbridge_enabled") == "1",
  290. RSSBridgeURL: r.FormValue("rssbridge_url"),
  291. OmnivoreEnabled: r.FormValue("omnivore_enabled") == "1",
  292. OmnivoreAPIKey: r.FormValue("omnivore_api_key"),
  293. OmnivoreURL: r.FormValue("omnivore_url"),
  294. RaindropEnabled: r.FormValue("raindrop_enabled") == "1",
  295. RaindropToken: r.FormValue("raindrop_token"),
  296. RaindropCollectionID: r.FormValue("raindrop_collection_id"),
  297. RaindropTags: r.FormValue("raindrop_tags"),
  298. BetulaEnabled: r.FormValue("betula_enabled") == "1",
  299. BetulaURL: r.FormValue("betula_url"),
  300. BetulaToken: r.FormValue("betula_token"),
  301. NtfyEnabled: r.FormValue("ntfy_enabled") == "1",
  302. NtfyTopic: r.FormValue("ntfy_topic"),
  303. NtfyURL: r.FormValue("ntfy_url"),
  304. NtfyAPIToken: r.FormValue("ntfy_api_token"),
  305. NtfyUsername: r.FormValue("ntfy_username"),
  306. NtfyPassword: r.FormValue("ntfy_password"),
  307. NtfyIconURL: r.FormValue("ntfy_icon_url"),
  308. }
  309. }
  310. func optionalInt64Field(formValue string) *int64 {
  311. if formValue == "" {
  312. return nil
  313. }
  314. value, _ := strconv.ParseInt(formValue, 10, 64)
  315. return &value
  316. }