integration.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  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. TelegramBotEnabled bool
  44. TelegramBotToken string
  45. TelegramBotChatID string
  46. TelegramBotTopicID *int64
  47. TelegramBotDisableWebPagePreview bool
  48. TelegramBotDisableNotification bool
  49. TelegramBotDisableButtons bool
  50. LinkAceEnabled bool
  51. LinkAceURL string
  52. LinkAceAPIKey string
  53. LinkAceTags string
  54. LinkAcePrivate bool
  55. LinkAceCheckDisabled bool
  56. LinkdingEnabled bool
  57. LinkdingURL string
  58. LinkdingAPIKey string
  59. LinkdingTags string
  60. LinkdingMarkAsUnread bool
  61. LinkwardenEnabled bool
  62. LinkwardenURL string
  63. LinkwardenAPIKey string
  64. MatrixBotEnabled bool
  65. MatrixBotUser string
  66. MatrixBotPassword string
  67. MatrixBotURL string
  68. MatrixBotChatID string
  69. AppriseEnabled bool
  70. AppriseURL string
  71. AppriseServicesURL string
  72. ReadeckEnabled bool
  73. ReadeckURL string
  74. ReadeckAPIKey string
  75. ReadeckLabels string
  76. ReadeckOnlyURL bool
  77. ShioriEnabled bool
  78. ShioriURL string
  79. ShioriUsername string
  80. ShioriPassword string
  81. ShaarliEnabled bool
  82. ShaarliURL string
  83. ShaarliAPISecret string
  84. WebhookEnabled bool
  85. WebhookURL string
  86. WebhookSecret string
  87. RSSBridgeEnabled bool
  88. RSSBridgeURL string
  89. RSSBridgeToken string
  90. OmnivoreEnabled bool
  91. OmnivoreAPIKey string
  92. OmnivoreURL string
  93. KarakeepEnabled bool
  94. KarakeepAPIKey string
  95. KarakeepURL string
  96. RaindropEnabled bool
  97. RaindropToken string
  98. RaindropCollectionID string
  99. RaindropTags string
  100. BetulaEnabled bool
  101. BetulaURL string
  102. BetulaToken string
  103. NtfyEnabled bool
  104. NtfyTopic string
  105. NtfyURL string
  106. NtfyAPIToken string
  107. NtfyUsername string
  108. NtfyPassword string
  109. NtfyIconURL string
  110. NtfyInternalLinks bool
  111. CuboxEnabled bool
  112. CuboxAPILink string
  113. DiscordEnabled bool
  114. DiscordWebhookLink string
  115. SlackEnabled bool
  116. SlackWebhookLink string
  117. PushoverEnabled bool
  118. PushoverUser string
  119. PushoverToken string
  120. PushoverDevice string
  121. PushoverPrefix string
  122. }
  123. // Merge copy form values to the model.
  124. func (i IntegrationForm) Merge(integration *model.Integration) {
  125. integration.PinboardEnabled = i.PinboardEnabled
  126. integration.PinboardToken = i.PinboardToken
  127. integration.PinboardTags = i.PinboardTags
  128. integration.PinboardMarkAsUnread = i.PinboardMarkAsUnread
  129. integration.InstapaperEnabled = i.InstapaperEnabled
  130. integration.InstapaperUsername = i.InstapaperUsername
  131. integration.InstapaperPassword = i.InstapaperPassword
  132. integration.FeverEnabled = i.FeverEnabled
  133. integration.FeverUsername = i.FeverUsername
  134. integration.GoogleReaderEnabled = i.GoogleReaderEnabled
  135. integration.GoogleReaderUsername = i.GoogleReaderUsername
  136. integration.WallabagEnabled = i.WallabagEnabled
  137. integration.WallabagOnlyURL = i.WallabagOnlyURL
  138. integration.WallabagURL = i.WallabagURL
  139. integration.WallabagClientID = i.WallabagClientID
  140. integration.WallabagClientSecret = i.WallabagClientSecret
  141. integration.WallabagUsername = i.WallabagUsername
  142. integration.WallabagPassword = i.WallabagPassword
  143. integration.NotionEnabled = i.NotionEnabled
  144. integration.NotionPageID = i.NotionPageID
  145. integration.NotionToken = i.NotionToken
  146. integration.NunuxKeeperEnabled = i.NunuxKeeperEnabled
  147. integration.NunuxKeeperURL = i.NunuxKeeperURL
  148. integration.NunuxKeeperAPIKey = i.NunuxKeeperAPIKey
  149. integration.EspialEnabled = i.EspialEnabled
  150. integration.EspialURL = i.EspialURL
  151. integration.EspialAPIKey = i.EspialAPIKey
  152. integration.EspialTags = i.EspialTags
  153. integration.ReadwiseEnabled = i.ReadwiseEnabled
  154. integration.ReadwiseAPIKey = i.ReadwiseAPIKey
  155. integration.TelegramBotEnabled = i.TelegramBotEnabled
  156. integration.TelegramBotToken = i.TelegramBotToken
  157. integration.TelegramBotChatID = i.TelegramBotChatID
  158. integration.TelegramBotTopicID = i.TelegramBotTopicID
  159. integration.TelegramBotDisableWebPagePreview = i.TelegramBotDisableWebPagePreview
  160. integration.TelegramBotDisableNotification = i.TelegramBotDisableNotification
  161. integration.TelegramBotDisableButtons = i.TelegramBotDisableButtons
  162. integration.LinkAceEnabled = i.LinkAceEnabled
  163. integration.LinkAceURL = i.LinkAceURL
  164. integration.LinkAceAPIKey = i.LinkAceAPIKey
  165. integration.LinkAceTags = i.LinkAceTags
  166. integration.LinkAcePrivate = i.LinkAcePrivate
  167. integration.LinkAceCheckDisabled = i.LinkAceCheckDisabled
  168. integration.LinkdingEnabled = i.LinkdingEnabled
  169. integration.LinkdingURL = i.LinkdingURL
  170. integration.LinkdingAPIKey = i.LinkdingAPIKey
  171. integration.LinkdingTags = i.LinkdingTags
  172. integration.LinkdingMarkAsUnread = i.LinkdingMarkAsUnread
  173. integration.LinkwardenEnabled = i.LinkwardenEnabled
  174. integration.LinkwardenURL = i.LinkwardenURL
  175. integration.LinkwardenAPIKey = i.LinkwardenAPIKey
  176. integration.MatrixBotEnabled = i.MatrixBotEnabled
  177. integration.MatrixBotUser = i.MatrixBotUser
  178. integration.MatrixBotPassword = i.MatrixBotPassword
  179. integration.MatrixBotURL = i.MatrixBotURL
  180. integration.MatrixBotChatID = i.MatrixBotChatID
  181. integration.AppriseEnabled = i.AppriseEnabled
  182. integration.AppriseServicesURL = i.AppriseServicesURL
  183. integration.AppriseURL = i.AppriseURL
  184. integration.ReadeckEnabled = i.ReadeckEnabled
  185. integration.ReadeckURL = i.ReadeckURL
  186. integration.ReadeckAPIKey = i.ReadeckAPIKey
  187. integration.ReadeckLabels = i.ReadeckLabels
  188. integration.ReadeckOnlyURL = i.ReadeckOnlyURL
  189. integration.ShioriEnabled = i.ShioriEnabled
  190. integration.ShioriURL = i.ShioriURL
  191. integration.ShioriUsername = i.ShioriUsername
  192. integration.ShioriPassword = i.ShioriPassword
  193. integration.ShaarliEnabled = i.ShaarliEnabled
  194. integration.ShaarliURL = i.ShaarliURL
  195. integration.ShaarliAPISecret = i.ShaarliAPISecret
  196. integration.WebhookEnabled = i.WebhookEnabled
  197. integration.WebhookURL = i.WebhookURL
  198. integration.RSSBridgeEnabled = i.RSSBridgeEnabled
  199. integration.RSSBridgeURL = i.RSSBridgeURL
  200. integration.RSSBridgeToken = i.RSSBridgeToken
  201. integration.OmnivoreEnabled = i.OmnivoreEnabled
  202. integration.OmnivoreAPIKey = i.OmnivoreAPIKey
  203. integration.OmnivoreURL = i.OmnivoreURL
  204. integration.KarakeepEnabled = i.KarakeepEnabled
  205. integration.KarakeepAPIKey = i.KarakeepAPIKey
  206. integration.KarakeepURL = i.KarakeepURL
  207. integration.RaindropEnabled = i.RaindropEnabled
  208. integration.RaindropToken = i.RaindropToken
  209. integration.RaindropCollectionID = i.RaindropCollectionID
  210. integration.RaindropTags = i.RaindropTags
  211. integration.BetulaEnabled = i.BetulaEnabled
  212. integration.BetulaURL = i.BetulaURL
  213. integration.BetulaToken = i.BetulaToken
  214. integration.NtfyEnabled = i.NtfyEnabled
  215. integration.NtfyTopic = i.NtfyTopic
  216. integration.NtfyURL = i.NtfyURL
  217. integration.NtfyAPIToken = i.NtfyAPIToken
  218. integration.NtfyUsername = i.NtfyUsername
  219. integration.NtfyPassword = i.NtfyPassword
  220. integration.NtfyIconURL = i.NtfyIconURL
  221. integration.NtfyInternalLinks = i.NtfyInternalLinks
  222. integration.CuboxEnabled = i.CuboxEnabled
  223. integration.CuboxAPILink = i.CuboxAPILink
  224. integration.DiscordEnabled = i.DiscordEnabled
  225. integration.DiscordWebhookLink = i.DiscordWebhookLink
  226. integration.SlackEnabled = i.SlackEnabled
  227. integration.SlackWebhookLink = i.SlackWebhookLink
  228. integration.PushoverEnabled = i.PushoverEnabled
  229. integration.PushoverUser = i.PushoverUser
  230. integration.PushoverToken = i.PushoverToken
  231. integration.PushoverDevice = i.PushoverDevice
  232. integration.PushoverPrefix = i.PushoverPrefix
  233. }
  234. // NewIntegrationForm returns a new IntegrationForm.
  235. func NewIntegrationForm(r *http.Request) *IntegrationForm {
  236. return &IntegrationForm{
  237. PinboardEnabled: r.FormValue("pinboard_enabled") == "1",
  238. PinboardToken: r.FormValue("pinboard_token"),
  239. PinboardTags: r.FormValue("pinboard_tags"),
  240. PinboardMarkAsUnread: r.FormValue("pinboard_mark_as_unread") == "1",
  241. InstapaperEnabled: r.FormValue("instapaper_enabled") == "1",
  242. InstapaperUsername: r.FormValue("instapaper_username"),
  243. InstapaperPassword: r.FormValue("instapaper_password"),
  244. FeverEnabled: r.FormValue("fever_enabled") == "1",
  245. FeverUsername: r.FormValue("fever_username"),
  246. FeverPassword: r.FormValue("fever_password"),
  247. GoogleReaderEnabled: r.FormValue("googlereader_enabled") == "1",
  248. GoogleReaderUsername: r.FormValue("googlereader_username"),
  249. GoogleReaderPassword: r.FormValue("googlereader_password"),
  250. WallabagEnabled: r.FormValue("wallabag_enabled") == "1",
  251. WallabagOnlyURL: r.FormValue("wallabag_only_url") == "1",
  252. WallabagURL: r.FormValue("wallabag_url"),
  253. WallabagClientID: r.FormValue("wallabag_client_id"),
  254. WallabagClientSecret: r.FormValue("wallabag_client_secret"),
  255. WallabagUsername: r.FormValue("wallabag_username"),
  256. WallabagPassword: r.FormValue("wallabag_password"),
  257. NotionEnabled: r.FormValue("notion_enabled") == "1",
  258. NotionPageID: r.FormValue("notion_page_id"),
  259. NotionToken: r.FormValue("notion_token"),
  260. NunuxKeeperEnabled: r.FormValue("nunux_keeper_enabled") == "1",
  261. NunuxKeeperURL: r.FormValue("nunux_keeper_url"),
  262. NunuxKeeperAPIKey: r.FormValue("nunux_keeper_api_key"),
  263. EspialEnabled: r.FormValue("espial_enabled") == "1",
  264. EspialURL: r.FormValue("espial_url"),
  265. EspialAPIKey: r.FormValue("espial_api_key"),
  266. EspialTags: r.FormValue("espial_tags"),
  267. ReadwiseEnabled: r.FormValue("readwise_enabled") == "1",
  268. ReadwiseAPIKey: r.FormValue("readwise_api_key"),
  269. TelegramBotEnabled: r.FormValue("telegram_bot_enabled") == "1",
  270. TelegramBotToken: r.FormValue("telegram_bot_token"),
  271. TelegramBotChatID: r.FormValue("telegram_bot_chat_id"),
  272. TelegramBotTopicID: optionalInt64Field(r.FormValue("telegram_bot_topic_id")),
  273. TelegramBotDisableWebPagePreview: r.FormValue("telegram_bot_disable_web_page_preview") == "1",
  274. TelegramBotDisableNotification: r.FormValue("telegram_bot_disable_notification") == "1",
  275. TelegramBotDisableButtons: r.FormValue("telegram_bot_disable_buttons") == "1",
  276. LinkAceEnabled: r.FormValue("linkace_enabled") == "1",
  277. LinkAceURL: r.FormValue("linkace_url"),
  278. LinkAceAPIKey: r.FormValue("linkace_api_key"),
  279. LinkAceTags: r.FormValue("linkace_tags"),
  280. LinkAcePrivate: r.FormValue("linkace_is_private") == "1",
  281. LinkAceCheckDisabled: r.FormValue("linkace_check_disabled") == "1",
  282. LinkdingEnabled: r.FormValue("linkding_enabled") == "1",
  283. LinkdingURL: r.FormValue("linkding_url"),
  284. LinkdingAPIKey: r.FormValue("linkding_api_key"),
  285. LinkdingTags: r.FormValue("linkding_tags"),
  286. LinkdingMarkAsUnread: r.FormValue("linkding_mark_as_unread") == "1",
  287. LinkwardenEnabled: r.FormValue("linkwarden_enabled") == "1",
  288. LinkwardenURL: r.FormValue("linkwarden_url"),
  289. LinkwardenAPIKey: r.FormValue("linkwarden_api_key"),
  290. MatrixBotEnabled: r.FormValue("matrix_bot_enabled") == "1",
  291. MatrixBotUser: r.FormValue("matrix_bot_user"),
  292. MatrixBotPassword: r.FormValue("matrix_bot_password"),
  293. MatrixBotURL: r.FormValue("matrix_bot_url"),
  294. MatrixBotChatID: r.FormValue("matrix_bot_chat_id"),
  295. AppriseEnabled: r.FormValue("apprise_enabled") == "1",
  296. AppriseURL: r.FormValue("apprise_url"),
  297. AppriseServicesURL: r.FormValue("apprise_services_url"),
  298. ReadeckEnabled: r.FormValue("readeck_enabled") == "1",
  299. ReadeckURL: r.FormValue("readeck_url"),
  300. ReadeckAPIKey: r.FormValue("readeck_api_key"),
  301. ReadeckLabels: r.FormValue("readeck_labels"),
  302. ReadeckOnlyURL: r.FormValue("readeck_only_url") == "1",
  303. ShioriEnabled: r.FormValue("shiori_enabled") == "1",
  304. ShioriURL: r.FormValue("shiori_url"),
  305. ShioriUsername: r.FormValue("shiori_username"),
  306. ShioriPassword: r.FormValue("shiori_password"),
  307. ShaarliEnabled: r.FormValue("shaarli_enabled") == "1",
  308. ShaarliURL: r.FormValue("shaarli_url"),
  309. ShaarliAPISecret: r.FormValue("shaarli_api_secret"),
  310. WebhookEnabled: r.FormValue("webhook_enabled") == "1",
  311. WebhookURL: r.FormValue("webhook_url"),
  312. RSSBridgeEnabled: r.FormValue("rssbridge_enabled") == "1",
  313. RSSBridgeURL: r.FormValue("rssbridge_url"),
  314. RSSBridgeToken: r.FormValue("rssbridge_token"),
  315. OmnivoreEnabled: r.FormValue("omnivore_enabled") == "1",
  316. OmnivoreAPIKey: r.FormValue("omnivore_api_key"),
  317. OmnivoreURL: r.FormValue("omnivore_url"),
  318. KarakeepEnabled: r.FormValue("karakeep_enabled") == "1",
  319. KarakeepAPIKey: r.FormValue("karakeep_api_key"),
  320. KarakeepURL: r.FormValue("karakeep_url"),
  321. RaindropEnabled: r.FormValue("raindrop_enabled") == "1",
  322. RaindropToken: r.FormValue("raindrop_token"),
  323. RaindropCollectionID: r.FormValue("raindrop_collection_id"),
  324. RaindropTags: r.FormValue("raindrop_tags"),
  325. BetulaEnabled: r.FormValue("betula_enabled") == "1",
  326. BetulaURL: r.FormValue("betula_url"),
  327. BetulaToken: r.FormValue("betula_token"),
  328. NtfyEnabled: r.FormValue("ntfy_enabled") == "1",
  329. NtfyTopic: r.FormValue("ntfy_topic"),
  330. NtfyURL: r.FormValue("ntfy_url"),
  331. NtfyAPIToken: r.FormValue("ntfy_api_token"),
  332. NtfyUsername: r.FormValue("ntfy_username"),
  333. NtfyPassword: r.FormValue("ntfy_password"),
  334. NtfyIconURL: r.FormValue("ntfy_icon_url"),
  335. NtfyInternalLinks: r.FormValue("ntfy_internal_links") == "1",
  336. CuboxEnabled: r.FormValue("cubox_enabled") == "1",
  337. CuboxAPILink: r.FormValue("cubox_api_link"),
  338. DiscordEnabled: r.FormValue("discord_enabled") == "1",
  339. DiscordWebhookLink: r.FormValue("discord_webhook_link"),
  340. SlackEnabled: r.FormValue("slack_enabled") == "1",
  341. SlackWebhookLink: r.FormValue("slack_webhook_link"),
  342. PushoverEnabled: r.FormValue("pushover_enabled") == "1",
  343. PushoverUser: r.FormValue("pushover_user"),
  344. PushoverToken: r.FormValue("pushover_token"),
  345. PushoverDevice: r.FormValue("pushover_device"),
  346. PushoverPrefix: r.FormValue("pushover_prefix"),
  347. }
  348. }
  349. func optionalInt64Field(formValue string) *int64 {
  350. if formValue == "" {
  351. return nil
  352. }
  353. value, _ := strconv.ParseInt(formValue, 10, 64)
  354. return &value
  355. }