integration.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  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. CuboxEnabled bool
  110. CuboxAPILink string
  111. }
  112. // Merge copy form values to the model.
  113. func (i IntegrationForm) Merge(integration *model.Integration) {
  114. integration.PinboardEnabled = i.PinboardEnabled
  115. integration.PinboardToken = i.PinboardToken
  116. integration.PinboardTags = i.PinboardTags
  117. integration.PinboardMarkAsUnread = i.PinboardMarkAsUnread
  118. integration.InstapaperEnabled = i.InstapaperEnabled
  119. integration.InstapaperUsername = i.InstapaperUsername
  120. integration.InstapaperPassword = i.InstapaperPassword
  121. integration.FeverEnabled = i.FeverEnabled
  122. integration.FeverUsername = i.FeverUsername
  123. integration.GoogleReaderEnabled = i.GoogleReaderEnabled
  124. integration.GoogleReaderUsername = i.GoogleReaderUsername
  125. integration.WallabagEnabled = i.WallabagEnabled
  126. integration.WallabagOnlyURL = i.WallabagOnlyURL
  127. integration.WallabagURL = i.WallabagURL
  128. integration.WallabagClientID = i.WallabagClientID
  129. integration.WallabagClientSecret = i.WallabagClientSecret
  130. integration.WallabagUsername = i.WallabagUsername
  131. integration.WallabagPassword = i.WallabagPassword
  132. integration.NotionEnabled = i.NotionEnabled
  133. integration.NotionPageID = i.NotionPageID
  134. integration.NotionToken = i.NotionToken
  135. integration.NunuxKeeperEnabled = i.NunuxKeeperEnabled
  136. integration.NunuxKeeperURL = i.NunuxKeeperURL
  137. integration.NunuxKeeperAPIKey = i.NunuxKeeperAPIKey
  138. integration.EspialEnabled = i.EspialEnabled
  139. integration.EspialURL = i.EspialURL
  140. integration.EspialAPIKey = i.EspialAPIKey
  141. integration.EspialTags = i.EspialTags
  142. integration.ReadwiseEnabled = i.ReadwiseEnabled
  143. integration.ReadwiseAPIKey = i.ReadwiseAPIKey
  144. integration.PocketEnabled = i.PocketEnabled
  145. integration.PocketAccessToken = i.PocketAccessToken
  146. integration.PocketConsumerKey = i.PocketConsumerKey
  147. integration.TelegramBotEnabled = i.TelegramBotEnabled
  148. integration.TelegramBotToken = i.TelegramBotToken
  149. integration.TelegramBotChatID = i.TelegramBotChatID
  150. integration.TelegramBotTopicID = i.TelegramBotTopicID
  151. integration.TelegramBotDisableWebPagePreview = i.TelegramBotDisableWebPagePreview
  152. integration.TelegramBotDisableNotification = i.TelegramBotDisableNotification
  153. integration.TelegramBotDisableButtons = i.TelegramBotDisableButtons
  154. integration.LinkAceEnabled = i.LinkAceEnabled
  155. integration.LinkAceURL = i.LinkAceURL
  156. integration.LinkAceAPIKey = i.LinkAceAPIKey
  157. integration.LinkAceTags = i.LinkAceTags
  158. integration.LinkAcePrivate = i.LinkAcePrivate
  159. integration.LinkAceCheckDisabled = i.LinkAceCheckDisabled
  160. integration.LinkdingEnabled = i.LinkdingEnabled
  161. integration.LinkdingURL = i.LinkdingURL
  162. integration.LinkdingAPIKey = i.LinkdingAPIKey
  163. integration.LinkdingTags = i.LinkdingTags
  164. integration.LinkdingMarkAsUnread = i.LinkdingMarkAsUnread
  165. integration.LinkwardenEnabled = i.LinkwardenEnabled
  166. integration.LinkwardenURL = i.LinkwardenURL
  167. integration.LinkwardenAPIKey = i.LinkwardenAPIKey
  168. integration.MatrixBotEnabled = i.MatrixBotEnabled
  169. integration.MatrixBotUser = i.MatrixBotUser
  170. integration.MatrixBotPassword = i.MatrixBotPassword
  171. integration.MatrixBotURL = i.MatrixBotURL
  172. integration.MatrixBotChatID = i.MatrixBotChatID
  173. integration.AppriseEnabled = i.AppriseEnabled
  174. integration.AppriseServicesURL = i.AppriseServicesURL
  175. integration.AppriseURL = i.AppriseURL
  176. integration.ReadeckEnabled = i.ReadeckEnabled
  177. integration.ReadeckURL = i.ReadeckURL
  178. integration.ReadeckAPIKey = i.ReadeckAPIKey
  179. integration.ReadeckLabels = i.ReadeckLabels
  180. integration.ReadeckOnlyURL = i.ReadeckOnlyURL
  181. integration.ShioriEnabled = i.ShioriEnabled
  182. integration.ShioriURL = i.ShioriURL
  183. integration.ShioriUsername = i.ShioriUsername
  184. integration.ShioriPassword = i.ShioriPassword
  185. integration.ShaarliEnabled = i.ShaarliEnabled
  186. integration.ShaarliURL = i.ShaarliURL
  187. integration.ShaarliAPISecret = i.ShaarliAPISecret
  188. integration.WebhookEnabled = i.WebhookEnabled
  189. integration.WebhookURL = i.WebhookURL
  190. integration.RSSBridgeEnabled = i.RSSBridgeEnabled
  191. integration.RSSBridgeURL = i.RSSBridgeURL
  192. integration.OmnivoreEnabled = i.OmnivoreEnabled
  193. integration.OmnivoreAPIKey = i.OmnivoreAPIKey
  194. integration.OmnivoreURL = i.OmnivoreURL
  195. integration.RaindropEnabled = i.RaindropEnabled
  196. integration.RaindropToken = i.RaindropToken
  197. integration.RaindropCollectionID = i.RaindropCollectionID
  198. integration.RaindropTags = i.RaindropTags
  199. integration.BetulaEnabled = i.BetulaEnabled
  200. integration.BetulaURL = i.BetulaURL
  201. integration.BetulaToken = i.BetulaToken
  202. integration.NtfyEnabled = i.NtfyEnabled
  203. integration.NtfyTopic = i.NtfyTopic
  204. integration.NtfyURL = i.NtfyURL
  205. integration.NtfyAPIToken = i.NtfyAPIToken
  206. integration.NtfyUsername = i.NtfyUsername
  207. integration.NtfyPassword = i.NtfyPassword
  208. integration.NtfyIconURL = i.NtfyIconURL
  209. integration.CuboxEnabled = i.CuboxEnabled
  210. integration.CuboxAPILink = i.CuboxAPILink
  211. }
  212. // NewIntegrationForm returns a new IntegrationForm.
  213. func NewIntegrationForm(r *http.Request) *IntegrationForm {
  214. return &IntegrationForm{
  215. PinboardEnabled: r.FormValue("pinboard_enabled") == "1",
  216. PinboardToken: r.FormValue("pinboard_token"),
  217. PinboardTags: r.FormValue("pinboard_tags"),
  218. PinboardMarkAsUnread: r.FormValue("pinboard_mark_as_unread") == "1",
  219. InstapaperEnabled: r.FormValue("instapaper_enabled") == "1",
  220. InstapaperUsername: r.FormValue("instapaper_username"),
  221. InstapaperPassword: r.FormValue("instapaper_password"),
  222. FeverEnabled: r.FormValue("fever_enabled") == "1",
  223. FeverUsername: r.FormValue("fever_username"),
  224. FeverPassword: r.FormValue("fever_password"),
  225. GoogleReaderEnabled: r.FormValue("googlereader_enabled") == "1",
  226. GoogleReaderUsername: r.FormValue("googlereader_username"),
  227. GoogleReaderPassword: r.FormValue("googlereader_password"),
  228. WallabagEnabled: r.FormValue("wallabag_enabled") == "1",
  229. WallabagOnlyURL: r.FormValue("wallabag_only_url") == "1",
  230. WallabagURL: r.FormValue("wallabag_url"),
  231. WallabagClientID: r.FormValue("wallabag_client_id"),
  232. WallabagClientSecret: r.FormValue("wallabag_client_secret"),
  233. WallabagUsername: r.FormValue("wallabag_username"),
  234. WallabagPassword: r.FormValue("wallabag_password"),
  235. NotionEnabled: r.FormValue("notion_enabled") == "1",
  236. NotionPageID: r.FormValue("notion_page_id"),
  237. NotionToken: r.FormValue("notion_token"),
  238. NunuxKeeperEnabled: r.FormValue("nunux_keeper_enabled") == "1",
  239. NunuxKeeperURL: r.FormValue("nunux_keeper_url"),
  240. NunuxKeeperAPIKey: r.FormValue("nunux_keeper_api_key"),
  241. EspialEnabled: r.FormValue("espial_enabled") == "1",
  242. EspialURL: r.FormValue("espial_url"),
  243. EspialAPIKey: r.FormValue("espial_api_key"),
  244. EspialTags: r.FormValue("espial_tags"),
  245. ReadwiseEnabled: r.FormValue("readwise_enabled") == "1",
  246. ReadwiseAPIKey: r.FormValue("readwise_api_key"),
  247. PocketEnabled: r.FormValue("pocket_enabled") == "1",
  248. PocketAccessToken: r.FormValue("pocket_access_token"),
  249. PocketConsumerKey: r.FormValue("pocket_consumer_key"),
  250. TelegramBotEnabled: r.FormValue("telegram_bot_enabled") == "1",
  251. TelegramBotToken: r.FormValue("telegram_bot_token"),
  252. TelegramBotChatID: r.FormValue("telegram_bot_chat_id"),
  253. TelegramBotTopicID: optionalInt64Field(r.FormValue("telegram_bot_topic_id")),
  254. TelegramBotDisableWebPagePreview: r.FormValue("telegram_bot_disable_web_page_preview") == "1",
  255. TelegramBotDisableNotification: r.FormValue("telegram_bot_disable_notification") == "1",
  256. TelegramBotDisableButtons: r.FormValue("telegram_bot_disable_buttons") == "1",
  257. LinkAceEnabled: r.FormValue("linkace_enabled") == "1",
  258. LinkAceURL: r.FormValue("linkace_url"),
  259. LinkAceAPIKey: r.FormValue("linkace_api_key"),
  260. LinkAceTags: r.FormValue("linkace_tags"),
  261. LinkAcePrivate: r.FormValue("linkace_is_private") == "1",
  262. LinkAceCheckDisabled: r.FormValue("linkace_check_disabled") == "1",
  263. LinkdingEnabled: r.FormValue("linkding_enabled") == "1",
  264. LinkdingURL: r.FormValue("linkding_url"),
  265. LinkdingAPIKey: r.FormValue("linkding_api_key"),
  266. LinkdingTags: r.FormValue("linkding_tags"),
  267. LinkdingMarkAsUnread: r.FormValue("linkding_mark_as_unread") == "1",
  268. LinkwardenEnabled: r.FormValue("linkwarden_enabled") == "1",
  269. LinkwardenURL: r.FormValue("linkwarden_url"),
  270. LinkwardenAPIKey: r.FormValue("linkwarden_api_key"),
  271. MatrixBotEnabled: r.FormValue("matrix_bot_enabled") == "1",
  272. MatrixBotUser: r.FormValue("matrix_bot_user"),
  273. MatrixBotPassword: r.FormValue("matrix_bot_password"),
  274. MatrixBotURL: r.FormValue("matrix_bot_url"),
  275. MatrixBotChatID: r.FormValue("matrix_bot_chat_id"),
  276. AppriseEnabled: r.FormValue("apprise_enabled") == "1",
  277. AppriseURL: r.FormValue("apprise_url"),
  278. AppriseServicesURL: r.FormValue("apprise_services_url"),
  279. ReadeckEnabled: r.FormValue("readeck_enabled") == "1",
  280. ReadeckURL: r.FormValue("readeck_url"),
  281. ReadeckAPIKey: r.FormValue("readeck_api_key"),
  282. ReadeckLabels: r.FormValue("readeck_labels"),
  283. ReadeckOnlyURL: r.FormValue("readeck_only_url") == "1",
  284. ShioriEnabled: r.FormValue("shiori_enabled") == "1",
  285. ShioriURL: r.FormValue("shiori_url"),
  286. ShioriUsername: r.FormValue("shiori_username"),
  287. ShioriPassword: r.FormValue("shiori_password"),
  288. ShaarliEnabled: r.FormValue("shaarli_enabled") == "1",
  289. ShaarliURL: r.FormValue("shaarli_url"),
  290. ShaarliAPISecret: r.FormValue("shaarli_api_secret"),
  291. WebhookEnabled: r.FormValue("webhook_enabled") == "1",
  292. WebhookURL: r.FormValue("webhook_url"),
  293. RSSBridgeEnabled: r.FormValue("rssbridge_enabled") == "1",
  294. RSSBridgeURL: r.FormValue("rssbridge_url"),
  295. OmnivoreEnabled: r.FormValue("omnivore_enabled") == "1",
  296. OmnivoreAPIKey: r.FormValue("omnivore_api_key"),
  297. OmnivoreURL: r.FormValue("omnivore_url"),
  298. RaindropEnabled: r.FormValue("raindrop_enabled") == "1",
  299. RaindropToken: r.FormValue("raindrop_token"),
  300. RaindropCollectionID: r.FormValue("raindrop_collection_id"),
  301. RaindropTags: r.FormValue("raindrop_tags"),
  302. BetulaEnabled: r.FormValue("betula_enabled") == "1",
  303. BetulaURL: r.FormValue("betula_url"),
  304. BetulaToken: r.FormValue("betula_token"),
  305. NtfyEnabled: r.FormValue("ntfy_enabled") == "1",
  306. NtfyTopic: r.FormValue("ntfy_topic"),
  307. NtfyURL: r.FormValue("ntfy_url"),
  308. NtfyAPIToken: r.FormValue("ntfy_api_token"),
  309. NtfyUsername: r.FormValue("ntfy_username"),
  310. NtfyPassword: r.FormValue("ntfy_password"),
  311. NtfyIconURL: r.FormValue("ntfy_icon_url"),
  312. CuboxEnabled: r.FormValue("cubox_enabled") == "1",
  313. CuboxAPILink: r.FormValue("cubox_api_link"),
  314. }
  315. }
  316. func optionalInt64Field(formValue string) *int64 {
  317. if formValue == "" {
  318. return nil
  319. }
  320. value, _ := strconv.ParseInt(formValue, 10, 64)
  321. return &value
  322. }