helper.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import axios from 'axios'
  2. import { Client as NotionClient } from '@notionhq/client'
  3. const RATE_URL = 'https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml'
  4. const RATE_REGEXP = /<Cube currency=\'([A-Z]{3})\' rate=\'(\d+\.\d+)\'\/>/g
  5. export default {
  6. returnFailed(code, message) {
  7. process.stdout.write(JSON.stringify({
  8. complete: 1,
  9. code: code,
  10. description: message
  11. }) + "\n")
  12. },
  13. returnSuccess() {
  14. process.stdout.write(JSON.stringify({
  15. complete: 1,
  16. code: 0
  17. }) + "\n")
  18. },
  19. async fetchExchangeRateData(baseCurrency) {
  20. if (baseCurrency === null) {
  21. baseCurrency = 'CNY'
  22. }
  23. const result = { EUR: 1.0 }
  24. const resp = await axios.get(RATE_URL)
  25. const matches = [...resp.data.matchAll(RATE_REGEXP)]
  26. let baseRate = .0
  27. matches.forEach(item => {
  28. if (baseCurrency === item[1]) {
  29. baseRate = parseFloat(item[2])
  30. }
  31. result[item[1]] = parseFloat(item[2])
  32. })
  33. for (let key in result) {
  34. result[key] = baseRate / result[key]
  35. }
  36. return result
  37. },
  38. async updateRate(NOTION_KEY, DATABASE_ID, rateMap) {
  39. const notion = new NotionClient({auth: NOTION_KEY})
  40. const database = await notion.databases.query({database_id: DATABASE_ID})
  41. for (const page of database.results) {
  42. let currency = page.properties['Currency']['title'][0]['plain_text']
  43. if (!currency in rateMap) {
  44. continue;
  45. }
  46. await notion.pages.update({
  47. page_id: page.id,
  48. properties: {
  49. Rate: {
  50. number: rateMap[currency]
  51. }
  52. }
  53. })
  54. }
  55. }
  56. }