@fc3/mmcadi 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (460) hide show
  1. package/LICENSE +673 -0
  2. package/README.md +5 -0
  3. package/bin/compile +63 -0
  4. package/bin/copy-static-files +13 -0
  5. package/bin/install +5 -0
  6. package/bin/precompile +55 -0
  7. package/bin/prepublish +7 -0
  8. package/bin/remap-paths +113 -0
  9. package/bin/test +9 -0
  10. package/config/tsconfig.json +37 -0
  11. package/package.json +33 -0
  12. package/src/bootstrap/start.ts +12 -0
  13. package/src/client/bootstrap.ts +5 -0
  14. package/src/client/client.ts +54 -0
  15. package/src/client/enum/key-code.ts +34 -0
  16. package/src/client/enum/page-type.ts +19 -0
  17. package/src/client/factory/page.ts +61 -0
  18. package/src/client/page/confirm-delete-block.ts +30 -0
  19. package/src/client/page/create-block.ts +6 -0
  20. package/src/client/page/day.ts +8 -0
  21. package/src/client/page/edit-block.ts +43 -0
  22. package/src/client/page/edit-custom.ts +16 -0
  23. package/src/client/page/home.ts +8 -0
  24. package/src/client/page/login.ts +8 -0
  25. package/src/client/page/logout.ts +8 -0
  26. package/src/client/page/month.ts +8 -0
  27. package/src/client/page/move-block.ts +8 -0
  28. package/src/client/page/select-block-type.ts +56 -0
  29. package/src/client/page/settings.ts +8 -0
  30. package/src/client/page/view-custom.ts +665 -0
  31. package/src/client/page/week.ts +8 -0
  32. package/src/client/page/year.ts +8 -0
  33. package/src/client/page.ts +128 -0
  34. package/src/client/shim/execute.ts +5 -0
  35. package/src/client/shim/logger.ts +44 -0
  36. package/src/client/utility/get-meta-value.ts +23 -0
  37. package/src/common/builder/block/background.ts +25 -0
  38. package/src/common/builder/block/folder.ts +43 -0
  39. package/src/common/builder/block/header.ts +15 -0
  40. package/src/common/builder/block/link.ts +32 -0
  41. package/src/common/builder/block/multicolumn.ts +16 -0
  42. package/src/common/builder/block/note.ts +13 -0
  43. package/src/common/builder/block/whitespace.ts +13 -0
  44. package/src/common/utility/get-parent-path.ts +29 -0
  45. package/src/constant/month-names.ts +16 -0
  46. package/src/enum/action-type.ts +11 -0
  47. package/src/enum/block-type.ts +18 -0
  48. package/src/enum/calendar-view-mode.ts +9 -0
  49. package/src/enum/color.ts +15 -0
  50. package/src/enum/default-role.ts +6 -0
  51. package/src/enum/directory-item-type.ts +6 -0
  52. package/src/enum/emoji.ts +94 -0
  53. package/src/enum/field-type.ts +8 -0
  54. package/src/enum/header-size.ts +7 -0
  55. package/src/enum/permission-type.ts +8 -0
  56. package/src/enum/time-place-visibility.ts +8 -0
  57. package/src/enum/tool-type.ts +14 -0
  58. package/src/index.ts +8 -0
  59. package/src/interface/hydration-callback.ts +7 -0
  60. package/src/interface/provider.ts +8 -0
  61. package/src/interface/repository.ts +12 -0
  62. package/src/lib/array/add.ts +10 -0
  63. package/src/lib/array/assert-is-empty.ts +23 -0
  64. package/src/lib/array/clone.ts +5 -0
  65. package/src/lib/array/difference.ts +8 -0
  66. package/src/lib/array/empty.ts +6 -0
  67. package/src/lib/array/equal.ts +24 -0
  68. package/src/lib/array/get-first-value.ts +5 -0
  69. package/src/lib/array/get-last-value.ts +5 -0
  70. package/src/lib/array/get-max-value.ts +5 -0
  71. package/src/lib/array/get-value-after.ts +23 -0
  72. package/src/lib/array/get-value-before.ts +23 -0
  73. package/src/lib/array/get-values-between.ts +18 -0
  74. package/src/lib/array/index.ts +5 -0
  75. package/src/lib/array/is-empty.ts +6 -0
  76. package/src/lib/array/remove.ts +19 -0
  77. package/src/lib/array/sum.ts +11 -0
  78. package/src/lib/array/unique.ts +13 -0
  79. package/src/lib/environment/bootstrap.ts +1 -0
  80. package/src/lib/environment/enum/environment-type.ts +8 -0
  81. package/src/lib/environment/enum/service-type.ts +5 -0
  82. package/src/lib/environment/index.ts +7 -0
  83. package/src/lib/environment/utility/get-environment-type.ts +28 -0
  84. package/src/lib/environment/utility/is-browser.ts +5 -0
  85. package/src/lib/environment/utility/is-development.ts +10 -0
  86. package/src/lib/environment/utility/is-production-or-staging.ts +8 -0
  87. package/src/lib/environment/utility/is-production.ts +10 -0
  88. package/src/lib/environment/utility/is-staging.ts +10 -0
  89. package/src/lib/errors/enum/error-type.ts +13 -0
  90. package/src/lib/errors/error/base.ts +40 -0
  91. package/src/lib/errors/error/conflict.ts +16 -0
  92. package/src/lib/errors/error/generic.ts +23 -0
  93. package/src/lib/errors/error/invalid.ts +14 -0
  94. package/src/lib/errors/error/invariant-violation.ts +5 -0
  95. package/src/lib/errors/error/not-allowed.ts +14 -0
  96. package/src/lib/errors/error/not-found.ts +16 -0
  97. package/src/lib/errors/error/not-implemented.ts +20 -0
  98. package/src/lib/errors/error/omitted.ts +14 -0
  99. package/src/lib/errors/error/timeout.ts +14 -0
  100. package/src/lib/errors/error/unauthorized.ts +14 -0
  101. package/src/lib/errors/index.ts +18 -0
  102. package/src/lib/errors/sugar/invariant.ts +7 -0
  103. package/src/lib/errors/type/coded-error.ts +7 -0
  104. package/src/lib/errors/type/error-data.ts +11 -0
  105. package/src/lib/errors/utility/create-error-for-error-type.ts +60 -0
  106. package/src/lib/errors/utility/create-error-from-ambiguous-json-data.ts +26 -0
  107. package/src/lib/errors/utility/error-matches.ts +28 -0
  108. package/src/lib/errors/utility/get-error-type-for-posix-error-code.ts +37 -0
  109. package/src/lib/errors/utility/get-error-type-for-status-code.ts +38 -0
  110. package/src/lib/errors/utility/get-message-for-error-type.ts +29 -0
  111. package/src/lib/errors/utility/matches-posix-error-code.ts +11 -0
  112. package/src/lib/errors/utility/wrap-error.ts +39 -0
  113. package/src/lib/event-emitter/index.ts +63 -0
  114. package/src/lib/execution-context/execution-context.ts +90 -0
  115. package/src/lib/execution-context/index.ts +8 -0
  116. package/src/lib/execution-context/type/session.ts +7 -0
  117. package/src/lib/feature/feature.ts +108 -0
  118. package/src/lib/feature/index.ts +3 -0
  119. package/src/lib/filesystem/bootstrap.ts +1 -0
  120. package/src/lib/filesystem/enum/file-extension.ts +19 -0
  121. package/src/lib/filesystem/index.ts +4 -0
  122. package/src/lib/filesystem/utility/exists.ts +21 -0
  123. package/src/lib/filesystem/utility/get-extension-for-filepath.ts +20 -0
  124. package/src/lib/filesystem/utility/strip-extension.ts +26 -0
  125. package/src/lib/grammar/index.ts +3 -0
  126. package/src/lib/grammar/noun-inflector.ts +104 -0
  127. package/src/lib/grammar/utility/get-words-from-identifier.ts +9 -0
  128. package/src/lib/grammar/verb-inflector.ts +344 -0
  129. package/src/lib/http/buffer-stream.ts +76 -0
  130. package/src/lib/http/enum/content-type.ts +19 -0
  131. package/src/lib/http/enum/cookie-attribute.ts +11 -0
  132. package/src/lib/http/enum/header.ts +29 -0
  133. package/src/lib/http/enum/method.ts +11 -0
  134. package/src/lib/http/enum/same-site-policy.ts +7 -0
  135. package/src/lib/http/enum/status-code.ts +9 -0
  136. package/src/lib/http/factory/body-parser.ts +55 -0
  137. package/src/lib/http/index.ts +24 -0
  138. package/src/lib/http/interface/client-request.ts +15 -0
  139. package/src/lib/http/interface/incoming-message.ts +24 -0
  140. package/src/lib/http/interface/network-library.ts +9 -0
  141. package/src/lib/http/interface/request-callback.ts +7 -0
  142. package/src/lib/http/isomorphic/request.ts +77 -0
  143. package/src/lib/http/isomorphic/response.ts +77 -0
  144. package/src/lib/http/isomorphic.ts +20 -0
  145. package/src/lib/http/parser/accept-header.ts +35 -0
  146. package/src/lib/http/parser/basic-auth-header.ts +48 -0
  147. package/src/lib/http/parser/body/json.ts +14 -0
  148. package/src/lib/http/parser/body/multipart.ts +89 -0
  149. package/src/lib/http/parser/body/url-encoded.ts +16 -0
  150. package/src/lib/http/parser/body.ts +44 -0
  151. package/src/lib/http/parser/cookie.ts +114 -0
  152. package/src/lib/http/parser/querystring.ts +92 -0
  153. package/src/lib/http/parser/url.ts +76 -0
  154. package/src/lib/http/request/incoming.ts +299 -0
  155. package/src/lib/http/request/outgoing.ts +276 -0
  156. package/src/lib/http/request.ts +26 -0
  157. package/src/lib/http/response/incoming.ts +243 -0
  158. package/src/lib/http/response/outgoing.ts +160 -0
  159. package/src/lib/http/response.ts +74 -0
  160. package/src/lib/http/serializer/basic-auth-header.ts +27 -0
  161. package/src/lib/http/serializer/cookie.ts +90 -0
  162. package/src/lib/http/serializer/query-data.ts +54 -0
  163. package/src/lib/http/transaction.ts +320 -0
  164. package/src/lib/http/type/basic-auth-credentials.ts +6 -0
  165. package/src/lib/http/type/header-map.ts +5 -0
  166. package/src/lib/http/type/log-attributes.ts +12 -0
  167. package/src/lib/http/type/path-parameters.ts +5 -0
  168. package/src/lib/http/type/query-data.ts +7 -0
  169. package/src/lib/http/type/query-value.ts +11 -0
  170. package/src/lib/http/type/request-options.ts +16 -0
  171. package/src/lib/http/type/transaction-data.ts +4 -0
  172. package/src/lib/http/utility/get-content-type-for-extension.ts +47 -0
  173. package/src/lib/http/utility/get-library-for-protocol.ts +25 -0
  174. package/src/lib/http/utility/get-status-code-for-error-type.ts +37 -0
  175. package/src/lib/http/utility/get-status-code-for-error.ts +13 -0
  176. package/src/lib/http/utility/is-client-error-status.ts +15 -0
  177. package/src/lib/http/utility/is-error-status.ts +9 -0
  178. package/src/lib/http/utility/is-server-error-status.ts +7 -0
  179. package/src/lib/http/utility/is-success-status.ts +7 -0
  180. package/src/lib/http/utility/proxy-request.ts +58 -0
  181. package/src/lib/http/utility/serialize-request-options.ts +9 -0
  182. package/src/lib/http/utility/slug-generator.ts +20 -0
  183. package/src/lib/key-generator/index.ts +3 -0
  184. package/src/lib/key-generator/key-generator.ts +7 -0
  185. package/src/lib/logger/enum/ansi-escape-code.ts +14 -0
  186. package/src/lib/logger/enum/log-level.ts +8 -0
  187. package/src/lib/logger/formatter.ts +59 -0
  188. package/src/lib/logger/index.ts +7 -0
  189. package/src/lib/logger/interface/error-reporter.ts +7 -0
  190. package/src/lib/logger/interface/logger.ts +13 -0
  191. package/src/lib/logger/logger.ts +239 -0
  192. package/src/lib/logger/type/error-parameters.ts +9 -0
  193. package/src/lib/logger/type/loggable-data.ts +5 -0
  194. package/src/lib/logger/type/loggable-value.ts +1 -0
  195. package/src/lib/metrics/dispatcher.ts +264 -0
  196. package/src/lib/metrics/enum/dispatch-mode.ts +6 -0
  197. package/src/lib/metrics/index.ts +2 -0
  198. package/src/lib/metrics/settings-hydrator.ts +51 -0
  199. package/src/lib/metrics/type/dispatcher-settings.ts +12 -0
  200. package/src/lib/metrics/type/tag-map.ts +5 -0
  201. package/src/lib/network/bootstrap.ts +1 -0
  202. package/src/lib/network/enum/connection-status.ts +14 -0
  203. package/src/lib/network/enum/http-status-code.ts +75 -0
  204. package/src/lib/network/enum/network-protocol.ts +10 -0
  205. package/src/lib/network/event-emitter.ts +63 -0
  206. package/src/lib/network/index.ts +7 -0
  207. package/src/lib/network/interface/socket.ts +42 -0
  208. package/src/lib/network/type/socket-options.ts +6 -0
  209. package/src/lib/network/utility/get-protocol-from-url.ts +15 -0
  210. package/src/lib/operation/index.ts +6 -0
  211. package/src/lib/operation/operation/auto-logging.ts +94 -0
  212. package/src/lib/operation/operation/silent.ts +17 -0
  213. package/src/lib/operation/operation.ts +80 -0
  214. package/src/lib/process/bootstrap.ts +1 -0
  215. package/src/lib/process/enum/posix-error-code.ts +138 -0
  216. package/src/lib/process/enum/process-signal.ts +68 -0
  217. package/src/lib/process/error.ts +6 -0
  218. package/src/lib/process/execute.ts +77 -0
  219. package/src/lib/process/index.ts +4 -0
  220. package/src/lib/process/type/command-options.ts +9 -0
  221. package/src/lib/process/utility/bind-process-lifespan-to.ts +10 -0
  222. package/src/lib/promise-wrapper/index.ts +3 -0
  223. package/src/lib/promise-wrapper/promise-wrapper.ts +51 -0
  224. package/src/lib/random/chance.ts +5 -0
  225. package/src/lib/random/element.ts +7 -0
  226. package/src/lib/random/elements.ts +12 -0
  227. package/src/lib/random/enum.ts +34 -0
  228. package/src/lib/random/enums.ts +11 -0
  229. package/src/lib/random/index.ts +3 -0
  230. package/src/lib/random/number.ts +8 -0
  231. package/src/lib/server/base.ts +194 -0
  232. package/src/lib/server/enum/server-event.ts +5 -0
  233. package/src/lib/server/enum/server-status.ts +10 -0
  234. package/src/lib/server/http/endpoint/ping.ts +21 -0
  235. package/src/lib/server/http/endpoint.ts +345 -0
  236. package/src/lib/server/http/interface/endpoint-constructor.ts +12 -0
  237. package/src/lib/server/http/interface/result-serializer.ts +5 -0
  238. package/src/lib/server/http/middleware.ts +18 -0
  239. package/src/lib/server/http/result-serializer/html.ts +92 -0
  240. package/src/lib/server/http/result-serializer/json.ts +23 -0
  241. package/src/lib/server/http/route.ts +104 -0
  242. package/src/lib/server/http/router.ts +125 -0
  243. package/src/lib/server/http/type/session-resolver.ts +8 -0
  244. package/src/lib/server/http/utility/create-server.ts +34 -0
  245. package/src/lib/server/http/utility/path-parser.ts +49 -0
  246. package/src/lib/server/http/utility/standardize-html-indentation.ts +54 -0
  247. package/src/lib/server/http/websocket-wrapper.ts +83 -0
  248. package/src/lib/server/http.ts +301 -0
  249. package/src/lib/server/index.ts +5 -0
  250. package/src/lib/server/tcp.ts +53 -0
  251. package/src/lib/server/type/server-options.ts +10 -0
  252. package/src/lib/string/calculate-length.ts +17 -0
  253. package/src/lib/string/capitalize.ts +8 -0
  254. package/src/lib/string/create-slug.ts +14 -0
  255. package/src/lib/string/enum/ansi-escape-code.ts +14 -0
  256. package/src/lib/string/enum/string-encoding.ts +9 -0
  257. package/src/lib/string/hyphenate.ts +5 -0
  258. package/src/lib/string/index.ts +3 -0
  259. package/src/lib/string/pad.ts +14 -0
  260. package/src/lib/string/trim-multiline.ts +21 -0
  261. package/src/lib/string/trim.ts +8 -0
  262. package/src/lib/tcp/channel.ts +13 -0
  263. package/src/lib/tcp/connection/incoming.ts +72 -0
  264. package/src/lib/tcp/connection/outgoing.ts +219 -0
  265. package/src/lib/tcp/connection.ts +360 -0
  266. package/src/lib/tcp/enum/connection-event.ts +12 -0
  267. package/src/lib/tcp/enum/message-type.ts +9 -0
  268. package/src/lib/tcp/index.ts +1 -0
  269. package/src/lib/tcp/type/connection-parameters.ts +6 -0
  270. package/src/lib/tcp/type/message/channel-close.ts +9 -0
  271. package/src/lib/tcp/type/message/channel-open.ts +9 -0
  272. package/src/lib/tcp/type/message.ts +10 -0
  273. package/src/lib/test/index.ts +2 -0
  274. package/src/lib/test/utility/build-config.ts +17 -0
  275. package/src/lib/test/utility/build-execution-context.ts +11 -0
  276. package/src/lib/time/bootstrap.ts +1 -0
  277. package/src/lib/time/enum/time-interval.ts +12 -0
  278. package/src/lib/time/index.ts +4 -0
  279. package/src/lib/time/utility/format-duration.ts +139 -0
  280. package/src/lib/time/utility/format-relative-duration.ts +22 -0
  281. package/src/lib/time/utility/sleep.ts +9 -0
  282. package/src/operation.ts +18 -0
  283. package/src/server/endpoint/abstract-page.ts +126 -0
  284. package/src/server/endpoint/action/create.ts +545 -0
  285. package/src/server/endpoint/action/get.ts +231 -0
  286. package/src/server/endpoint/base.ts +51 -0
  287. package/src/server/endpoint/day.ts +13 -0
  288. package/src/server/endpoint/generic-page.ts +14 -0
  289. package/src/server/endpoint/index.ts +11 -0
  290. package/src/server/endpoint/login.ts +45 -0
  291. package/src/server/endpoint/logout.ts +38 -0
  292. package/src/server/endpoint/month.ts +35 -0
  293. package/src/server/endpoint/robots.ts +18 -0
  294. package/src/server/endpoint/session/create.ts +62 -0
  295. package/src/server/endpoint/settings/get.ts +40 -0
  296. package/src/server/endpoint/settings/update.ts +44 -0
  297. package/src/server/endpoint/today.ts +15 -0
  298. package/src/server/endpoint/week.ts +34 -0
  299. package/src/server/endpoint/year.ts +34 -0
  300. package/src/server/enum/custom-page-type.ts +10 -0
  301. package/src/server/factory/block-result-serializer.ts +115 -0
  302. package/src/server/middleware/base.ts +6 -0
  303. package/src/server/middleware/error-handler.ts +177 -0
  304. package/src/server/middleware/static-file.ts +83 -0
  305. package/src/server/operation/add-block.ts +110 -0
  306. package/src/server/operation/create-session.ts +43 -0
  307. package/src/server/operation/delete-block.ts +96 -0
  308. package/src/server/operation/demote-block.ts +108 -0
  309. package/src/server/operation/destroy-session.ts +26 -0
  310. package/src/server/operation/load-account.ts +30 -0
  311. package/src/server/operation/load-block.ts +48 -0
  312. package/src/server/operation/load-directory-items.ts +75 -0
  313. package/src/server/operation/load-page.ts +368 -0
  314. package/src/server/operation/promote-block.ts +104 -0
  315. package/src/server/operation/save-page.ts +60 -0
  316. package/src/server/operation/update-account-settings.ts +52 -0
  317. package/src/server/operation/update-block.ts +124 -0
  318. package/src/server/repository/memory.ts +112 -0
  319. package/src/server/result-serializer/action.ts +939 -0
  320. package/src/server/result-serializer/base.ts +1267 -0
  321. package/src/server/result-serializer/block/audio.ts +33 -0
  322. package/src/server/result-serializer/block/background.ts +20 -0
  323. package/src/server/result-serializer/block/calendar.ts +148 -0
  324. package/src/server/result-serializer/block/directory.ts +57 -0
  325. package/src/server/result-serializer/block/ephemeral.ts +14 -0
  326. package/src/server/result-serializer/block/folder.ts +106 -0
  327. package/src/server/result-serializer/block/header.ts +31 -0
  328. package/src/server/result-serializer/block/image.ts +46 -0
  329. package/src/server/result-serializer/block/link.ts +40 -0
  330. package/src/server/result-serializer/block/list.ts +140 -0
  331. package/src/server/result-serializer/block/multi-column.ts +97 -0
  332. package/src/server/result-serializer/block/note.ts +44 -0
  333. package/src/server/result-serializer/block/todo.ts +78 -0
  334. package/src/server/result-serializer/block/whitespace.ts +15 -0
  335. package/src/server/result-serializer/block.ts +248 -0
  336. package/src/server/result-serializer/common/time-place-options.ts +33 -0
  337. package/src/server/result-serializer/login.ts +58 -0
  338. package/src/server/result-serializer/month.ts +170 -0
  339. package/src/server/result-serializer/page.ts +548 -0
  340. package/src/server/result-serializer/settings.ts +85 -0
  341. package/src/server/result-serializer/week.ts +195 -0
  342. package/src/server/result-serializer/year.ts +160 -0
  343. package/src/server/utility/accepts-content-type.ts +16 -0
  344. package/src/server/utility/accepts-html.ts +9 -0
  345. package/src/server/utility/accepts-json.ts +9 -0
  346. package/src/server/utility/add-days.ts +11 -0
  347. package/src/server/utility/create-date.ts +23 -0
  348. package/src/server/utility/create-index-path.ts +5 -0
  349. package/src/server/utility/create-slug.ts +9 -0
  350. package/src/server/utility/create-toast-path.ts +19 -0
  351. package/src/server/utility/date-less-than.ts +5 -0
  352. package/src/server/utility/date-occurs-before.ts +22 -0
  353. package/src/server/utility/date-to-key.ts +7 -0
  354. package/src/server/utility/date-to-label.ts +5 -0
  355. package/src/server/utility/date-to-path.ts +9 -0
  356. package/src/server/utility/dates-are-equal.ts +22 -0
  357. package/src/server/utility/dates-are-in-order.ts +9 -0
  358. package/src/server/utility/dates-are-on-the-same-day.ts +9 -0
  359. package/src/server/utility/dates-in-same-month.ts +8 -0
  360. package/src/server/utility/day-to-date.ts +40 -0
  361. package/src/server/utility/decrement-date.ts +11 -0
  362. package/src/server/utility/get-block-at-index-path.ts +32 -0
  363. package/src/server/utility/get-block-permissions.ts +15 -0
  364. package/src/server/utility/get-compact-label-for-date.ts +8 -0
  365. package/src/server/utility/get-custom-page-type-for-path.ts +37 -0
  366. package/src/server/utility/get-element-id-for-block.ts +15 -0
  367. package/src/server/utility/get-emoji-for-block-type.ts +39 -0
  368. package/src/server/utility/get-emoji-for-tool-type.ts +20 -0
  369. package/src/server/utility/get-end-of-month.ts +13 -0
  370. package/src/server/utility/get-end-of-week.ts +13 -0
  371. package/src/server/utility/get-filepath-for-folder-block.ts +23 -0
  372. package/src/server/utility/get-hex-for-color.ts +31 -0
  373. package/src/server/utility/get-label-for-time-place-visibility.ts +23 -0
  374. package/src/server/utility/get-month-name.ts +18 -0
  375. package/src/server/utility/get-next-day.ts +7 -0
  376. package/src/server/utility/get-next-month.ts +12 -0
  377. package/src/server/utility/get-next-week.ts +12 -0
  378. package/src/server/utility/get-next-year.ts +13 -0
  379. package/src/server/utility/get-ordinal-label-for-week.ts +11 -0
  380. package/src/server/utility/get-ordinal-of-week-within-month.ts +15 -0
  381. package/src/server/utility/get-padded-date.ts +11 -0
  382. package/src/server/utility/get-parent-index-path.ts +18 -0
  383. package/src/server/utility/get-path-for-folder-block.ts +25 -0
  384. package/src/server/utility/get-path-from-url.ts +13 -0
  385. package/src/server/utility/get-previous-index-path.ts +27 -0
  386. package/src/server/utility/get-previous-month.ts +12 -0
  387. package/src/server/utility/get-previous-week.ts +11 -0
  388. package/src/server/utility/get-previous-year.ts +13 -0
  389. package/src/server/utility/get-random-emoji-for-date.ts +109 -0
  390. package/src/server/utility/get-short-label-for-date.ts +11 -0
  391. package/src/server/utility/get-short-month-name.ts +9 -0
  392. package/src/server/utility/get-short-ordinal.ts +26 -0
  393. package/src/server/utility/get-siblings-and-index-for-index-path.ts +67 -0
  394. package/src/server/utility/get-start-of-month.ts +11 -0
  395. package/src/server/utility/get-start-of-week.ts +12 -0
  396. package/src/server/utility/get-start-of-year.ts +12 -0
  397. package/src/server/utility/get-weekday-name.ts +24 -0
  398. package/src/server/utility/increment-date.ts +15 -0
  399. package/src/server/utility/is-index-path.ts +5 -0
  400. package/src/server/utility/key-to-date.ts +25 -0
  401. package/src/server/utility/month-has-week-containing-date.ts +13 -0
  402. package/src/server/utility/month-to-date.ts +28 -0
  403. package/src/server/utility/month-to-path.ts +10 -0
  404. package/src/server/utility/months-are-equal.ts +8 -0
  405. package/src/server/utility/parse-index-path.ts +23 -0
  406. package/src/server/utility/path-is-date.ts +13 -0
  407. package/src/server/utility/path-to-date.ts +24 -0
  408. package/src/server/utility/subtract-days.ts +7 -0
  409. package/src/server/utility/validate-month.ts +10 -0
  410. package/src/server/utility/validate-page.ts +46 -0
  411. package/src/server/utility/validate-path.ts +9 -0
  412. package/src/server/utility/validate-url.ts +12 -0
  413. package/src/server/utility/week-greater-than.ts +10 -0
  414. package/src/server/utility/week-to-date.ts +8 -0
  415. package/src/server/utility/week-to-path.ts +12 -0
  416. package/src/server/utility/weeks-are-equal.ts +8 -0
  417. package/src/server/utility/year-to-date.ts +26 -0
  418. package/src/server/utility/year-to-path.ts +7 -0
  419. package/src/server/utility/years-are-equal.ts +8 -0
  420. package/src/server.ts +140 -0
  421. package/src/test.ts +195 -0
  422. package/src/type/account-settings.ts +9 -0
  423. package/src/type/account.ts +11 -0
  424. package/src/type/action/add-block.ts +74 -0
  425. package/src/type/action/complete-block.ts +10 -0
  426. package/src/type/action/delete-block.ts +11 -0
  427. package/src/type/action/demote-block.ts +9 -0
  428. package/src/type/action/edit-block.ts +11 -0
  429. package/src/type/action/promote-block.ts +9 -0
  430. package/src/type/action.ts +9 -0
  431. package/src/type/block/audio.ts +8 -0
  432. package/src/type/block/background.ts +10 -0
  433. package/src/type/block/directory.ts +18 -0
  434. package/src/type/block/ephemeral.ts +9 -0
  435. package/src/type/block/folder.ts +14 -0
  436. package/src/type/block/header.ts +11 -0
  437. package/src/type/block/image.ts +8 -0
  438. package/src/type/block/link.ts +12 -0
  439. package/src/type/block/list.ts +24 -0
  440. package/src/type/block/multi-column.ts +10 -0
  441. package/src/type/block/note.ts +9 -0
  442. package/src/type/block/todo.ts +10 -0
  443. package/src/type/block/whitespace.ts +9 -0
  444. package/src/type/block-metadata.ts +14 -0
  445. package/src/type/block.ts +18 -0
  446. package/src/type/day.ts +5 -0
  447. package/src/type/field-definition.ts +8 -0
  448. package/src/type/field-value.ts +5 -0
  449. package/src/type/file.ts +6 -0
  450. package/src/type/month.ts +5 -0
  451. package/src/type/page.ts +8 -0
  452. package/src/type/price.ts +11 -0
  453. package/src/type/resource.ts +5 -0
  454. package/src/type/runtime-config.ts +13 -0
  455. package/src/type/server-settings.ts +17 -0
  456. package/src/type/toast.ts +8 -0
  457. package/src/type/week.ts +5 -0
  458. package/src/type/year.ts +5 -0
  459. package/test/unit/index.ts +11 -0
  460. package/test/unit/server/operation/promote-block.ts +84 -0
@@ -0,0 +1,231 @@
1
+ import {ContentType, HttpMethod} from 'lib/http';
2
+ import {InvariantViolation, InvalidError} from 'lib/errors';
3
+
4
+ import BaseEndpoint from 'server/endpoint/base';
5
+ import BlockType from 'enum/block-type';
6
+ import ActionResultSerializer from 'server/result-serializer/action';
7
+ import getParentPath from 'common/utility/get-parent-path';
8
+ import getBlockPermissions from 'server/utility/get-block-permissions';
9
+ import getPathForFolderBlock from 'server/utility/get-path-for-folder-block';
10
+ import FolderBlock from 'type/block/folder';
11
+ import PermissionType from 'enum/permission-type';
12
+ import Color from 'enum/color';
13
+ import Emoji from 'enum/emoji';
14
+ import LoadPageOperation from 'server/operation/load-page';
15
+ import Block from 'type/block';
16
+ import validatePath from 'server/utility/validate-path';
17
+ import ActionType from 'enum/action-type';
18
+ import LoadBlockOperation from 'server/operation/load-block';
19
+ import AddBlockAction from 'type/action/add-block';
20
+ import LoadAccountOperation from 'server/operation/load-account';
21
+ import DeleteBlockAction from 'type/action/delete-block';
22
+ import EditBlockAction from 'type/action/edit-block';
23
+ import Action from 'type/action';
24
+
25
+ type GetActionInput = {};
26
+
27
+ type GetActionOutput = Partial<Action>;
28
+
29
+ class GetActionEndpoint extends BaseEndpoint<GetActionInput, GetActionOutput> {
30
+ public path = '/actions';
31
+ public method = HttpMethod.GET;
32
+ public content_types = [
33
+ ContentType.JSON,
34
+ ContentType.HTML
35
+ ];
36
+
37
+ protected async process(): Promise<GetActionOutput> {
38
+ this.verifyLoggedIn();
39
+
40
+ const action_type = this.getActionType();
41
+
42
+ switch (action_type) {
43
+ case ActionType.ADD_BLOCK:
44
+ return this.processAddBlock();
45
+
46
+ case ActionType.DELETE_BLOCK:
47
+ return this.processDeleteBlock();
48
+
49
+ case ActionType.EDIT_BLOCK:
50
+ return this.processEditBlock();
51
+
52
+ default:
53
+ throw new InvalidError(`Unsupported action type: ${action_type}`);
54
+ }
55
+ }
56
+
57
+ private async processAddBlock(): Promise<Partial<AddBlockAction>> {
58
+ const path = this.getPath();
59
+ const action_type = ActionType.ADD_BLOCK;
60
+ const block_type = this.getQueryParameter('block_type') as BlockType.NOTE | BlockType.IMAGE | undefined;
61
+ const editing = this.getQueryParameter('editing') === 'true';
62
+ const index_path = this.getQueryParameter('index_path') as string;
63
+
64
+ if (typeof index_path !== 'string') {
65
+ throw new InvalidError(`Invalid index path: ${index_path}`);
66
+ }
67
+
68
+ const parent_block = await this.loadParentBlock();
69
+ const parent_permissions = getBlockPermissions(parent_block);
70
+ const create_role = parent_permissions[PermissionType.CREATE];
71
+ const read_role = parent_permissions[PermissionType.READ];
72
+ const update_role = parent_permissions[PermissionType.UPDATE];
73
+ const delete_role = parent_permissions[PermissionType.DELETE];
74
+
75
+ return {
76
+ path,
77
+ action_type,
78
+ block_type,
79
+ index_path,
80
+ create_role,
81
+ read_role,
82
+ update_role,
83
+ delete_role,
84
+ editing
85
+ };
86
+ }
87
+
88
+ private async processDeleteBlock(): Promise<Partial<DeleteBlockAction>> {
89
+ const path = this.getPath();
90
+ const action_type = ActionType.DELETE_BLOCK;
91
+ const index_path = this.getQueryParameter('index_path') as string;
92
+
93
+ if (typeof index_path !== 'string') {
94
+ throw new InvalidError(`Invalid index path: ${index_path}`);
95
+ }
96
+
97
+ const execution_context = this.getExecutionContext();
98
+ const operation = new LoadBlockOperation(path, index_path, execution_context);
99
+ const block = await operation.perform();
100
+ const editing = false;
101
+
102
+ return {
103
+ path,
104
+ action_type,
105
+ index_path,
106
+ editing,
107
+ block
108
+ };
109
+ }
110
+
111
+ private async processEditBlock(): Promise<Partial<EditBlockAction>> {
112
+ const path = this.getPath();
113
+ const action_type = ActionType.EDIT_BLOCK;
114
+ const index_path = this.getQueryParameter('index_path');
115
+
116
+ if (typeof index_path !== 'string') {
117
+ throw new InvalidError(`Invalid index path: ${index_path}`);
118
+ }
119
+
120
+ const execution_context = this.getExecutionContext();
121
+ const operation = new LoadBlockOperation(path, index_path, execution_context);
122
+ const block = await operation.perform();
123
+ const editing = false;
124
+
125
+ return {
126
+ path,
127
+ action_type,
128
+ index_path,
129
+ editing,
130
+ block
131
+ };
132
+ }
133
+
134
+ protected async getHtmlResultSerializer(result: GetActionOutput): Promise<ActionResultSerializer> {
135
+ const session = this.getSession();
136
+ const path = '/actions';
137
+ const referrer_url = this.getReferrerUrl();
138
+ const execution_context = this.getExecutionContext();
139
+ const account_operation = new LoadAccountOperation(execution_context);
140
+ const {providers, roles} = execution_context.getConfig();
141
+ const provider_paths = Object.keys(providers);
142
+ const account = await account_operation.perform();
143
+
144
+ if (account === null) {
145
+ throw new InvariantViolation(`
146
+ Tried to read account for logged in user,
147
+ but they were not set
148
+ `);
149
+ }
150
+
151
+ const metadata = {
152
+ account,
153
+ roles,
154
+ provider_paths
155
+ };
156
+
157
+ return new ActionResultSerializer(
158
+ result,
159
+ metadata,
160
+ path,
161
+ referrer_url,
162
+ session
163
+ );
164
+ }
165
+
166
+ private async loadParentBlock(): Promise<Block> {
167
+ const path = this.getPath();
168
+ const parent_path = getParentPath(path);
169
+ const execution_context = this.getExecutionContext();
170
+ const page_operation = new LoadPageOperation(parent_path, execution_context);
171
+ const parent_page = await page_operation.perform();
172
+ const {blocks} = parent_page;
173
+
174
+ const parent_block = blocks.find((block) => {
175
+ const {block_type} = block;
176
+
177
+ if (block_type !== BlockType.FOLDER) {
178
+ return false;
179
+ }
180
+
181
+ const folder_path = getPathForFolderBlock({
182
+ base_path: '/',
183
+ block: block as FolderBlock
184
+ });
185
+
186
+ return folder_path === path;
187
+ });
188
+
189
+ if (parent_block === undefined) {
190
+ return {
191
+ block_type: BlockType.FOLDER,
192
+ created_at: Date.now(),
193
+ title: 'index',
194
+ subtitle: '',
195
+ emoji: Emoji.FOLDER,
196
+ color: Color.GREY
197
+ } as FolderBlock;
198
+ }
199
+
200
+ return parent_block;
201
+ }
202
+
203
+ private getActionType(): ActionType {
204
+ const action_type = this.getQueryParameter('action_type');
205
+
206
+ if (typeof action_type !== 'string') {
207
+ throw new InvalidError(`
208
+ Invalid action_type: ${action_type}
209
+ (was ${typeof action_type})
210
+ `);
211
+ }
212
+
213
+ return action_type as ActionType;
214
+ }
215
+
216
+ private getPath(): string {
217
+ const path = this.getQueryParameter('path');
218
+
219
+ if (typeof path !== 'string') {
220
+ throw new InvalidError(`
221
+ Invalid path: ${path}
222
+ `);
223
+ }
224
+
225
+ validatePath(path);
226
+
227
+ return path;
228
+ }
229
+ }
230
+
231
+ export default GetActionEndpoint;
@@ -0,0 +1,51 @@
1
+ import {Endpoint} from 'lib/server';
2
+ import {HttpHeader} from 'lib/http';
3
+ import {InvariantViolation, UnauthorizedError} from 'lib/errors';
4
+
5
+ import validateUrl from 'server/utility/validate-url';
6
+
7
+ type AllowedOutputs = string | Buffer | object;
8
+
9
+ abstract class BaseEndpoint<I, O extends AllowedOutputs> extends Endpoint<I, O> {
10
+ protected getHost(): string {
11
+ const request = this.getRequest();
12
+ const host = request.getHeaderValue(HttpHeader.HOST);
13
+
14
+ if (host === undefined) {
15
+ throw new InvariantViolation(`
16
+ Tried to read request host, but it was not set
17
+ `);
18
+ }
19
+
20
+ return host;
21
+ }
22
+
23
+ protected getReferrerUrl(): string {
24
+ const request = this.getRequest();
25
+ const referrer = request.getHeaderValue(HttpHeader.REFERER);
26
+
27
+ if (referrer !== undefined) {
28
+ validateUrl(referrer);
29
+
30
+ return referrer;
31
+ }
32
+
33
+ const host = this.getHost();
34
+ const protocol = request.getProtocol();
35
+ const host_url = `${protocol}://${host}`;
36
+
37
+ validateUrl(host_url);
38
+
39
+ return host_url;
40
+ }
41
+
42
+ protected verifyLoggedIn(): void {
43
+ const session = this.getSession();
44
+
45
+ if (session.account_id === null) {
46
+ throw new UnauthorizedError();
47
+ }
48
+ }
49
+ }
50
+
51
+ export default BaseEndpoint;
@@ -0,0 +1,13 @@
1
+ import AbstractPageEndpoint from 'server/endpoint/abstract-page';
2
+
3
+ class DayEndpoint extends AbstractPageEndpoint {
4
+ public path = '/day/:date';
5
+
6
+ protected async determinePath(): Promise<string> {
7
+ const key = this.getPathParameter('date');
8
+
9
+ return `/day/${key}`;
10
+ }
11
+ }
12
+
13
+ export default DayEndpoint;
@@ -0,0 +1,14 @@
1
+ import AbstractPageEndpoint from 'server/endpoint/abstract-page';
2
+
3
+ class GenericPageEndpoint extends AbstractPageEndpoint {
4
+ public path = '/[A-Za-z0-9\/-]+';
5
+
6
+ protected async determinePath(): Promise<string> {
7
+ const request = this.getRequest();
8
+ const path = request.getPath();
9
+
10
+ return path;
11
+ }
12
+ }
13
+
14
+ export default GenericPageEndpoint;
@@ -0,0 +1,11 @@
1
+ import AbstractPageEndpoint from 'server/endpoint/abstract-page';
2
+
3
+ class IndexEndpoint extends AbstractPageEndpoint {
4
+ public path = '/';
5
+
6
+ protected async determinePath(): Promise<string> {
7
+ return '/';
8
+ }
9
+ }
10
+
11
+ export default IndexEndpoint;
@@ -0,0 +1,45 @@
1
+ import {HttpMethod, ContentType} from 'lib/http';
2
+ import {InvalidError} from 'lib/errors';
3
+
4
+ import LoginResultSerializer from 'server/result-serializer/login';
5
+ import BaseEndpoint from 'server/endpoint/base';
6
+
7
+ type LoginInput = {};
8
+
9
+ type LoginOutput = {
10
+ readonly source_path: string;
11
+ };
12
+
13
+ class LoginEndpoint extends BaseEndpoint<LoginInput, LoginOutput> {
14
+ public path = '/login';
15
+ public method = HttpMethod.GET;
16
+ public content_types = [
17
+ ContentType.HTML
18
+ ];
19
+
20
+ protected async process(): Promise<LoginOutput> {
21
+ const raw_source = this.getQueryParameter('source') || '/';
22
+
23
+ if (typeof raw_source !== 'string') {
24
+ throw new InvalidError(`
25
+ Invalid source path: ${raw_source}
26
+ `);
27
+ }
28
+
29
+ const source_path = encodeURIComponent(raw_source);
30
+
31
+ return {
32
+ source_path
33
+ };
34
+ }
35
+
36
+ protected async getHtmlResultSerializer(result: LoginOutput): Promise<LoginResultSerializer> {
37
+ const session = this.getSession();
38
+ const path = '/login';
39
+ const referrer_url = this.getReferrerUrl();
40
+
41
+ return new LoginResultSerializer(result, path, referrer_url, session);
42
+ }
43
+ }
44
+
45
+ export default LoginEndpoint;
@@ -0,0 +1,38 @@
1
+ import {StatusCode, HttpHeader, HttpMethod, ContentType} from 'lib/http';
2
+
3
+ import DestroySessionOperation from 'server/operation/destroy-session';
4
+ import BaseEndpoint from 'server/endpoint/base';
5
+
6
+ type LogoutInput = {};
7
+ type LogoutOutput = string;
8
+
9
+ class LogoutEndpoint extends BaseEndpoint<LogoutInput, LogoutOutput> {
10
+ public path = '/logout';
11
+ public method = HttpMethod.GET;
12
+ public content_types = [
13
+ ContentType.JSON,
14
+ ContentType.HTML
15
+ ];
16
+
17
+ protected async process(): Promise<LogoutOutput> {
18
+ const session = this.getSession();
19
+ const execution_context = this.getExecutionContext();
20
+
21
+ const operation = new DestroySessionOperation(
22
+ session.id,
23
+ execution_context
24
+ );
25
+
26
+ await operation.perform();
27
+
28
+ const response = this.getResponse();
29
+ const url = '/?toast_message=logged+out&toast_color=%23FC3';
30
+
31
+ response.setHeaderValue(HttpHeader.LOCATION, url);
32
+ response.setStatusCode(StatusCode.REDIRECT);
33
+
34
+ return '';
35
+ }
36
+ }
37
+
38
+ export default LogoutEndpoint;
@@ -0,0 +1,35 @@
1
+ import {HttpMethod, ContentType} from 'lib/http';
2
+
3
+ import BaseEndpoint from 'server/endpoint/base';
4
+ import Month from 'type/month';
5
+ import MonthResultSerializer from 'server/result-serializer/month';
6
+ import validateMonth from 'server/utility/validate-month';
7
+
8
+ class MonthEndpoint extends BaseEndpoint<unknown, Month> {
9
+ public path = '/month/:key';
10
+ public method = HttpMethod.GET;
11
+
12
+ public content_types = [
13
+ ContentType.HTML,
14
+ ContentType.JSON
15
+ ];
16
+
17
+ protected async process(): Promise<Month> {
18
+ const key = this.getPathParameter('key');
19
+
20
+ return validateMonth({
21
+ key
22
+ });
23
+ }
24
+
25
+ protected async getHtmlResultSerializer(result: Month): Promise<MonthResultSerializer> {
26
+ const session = this.getSession();
27
+ const request = this.getRequest();
28
+ const path = request.getPath();
29
+ const referrer_url = this.getReferrerUrl();
30
+
31
+ return new MonthResultSerializer(result, path, referrer_url, session);
32
+ }
33
+ }
34
+
35
+ export default MonthEndpoint;
@@ -0,0 +1,18 @@
1
+ import {HttpMethod, ContentType} from 'lib/http';
2
+
3
+ import BaseEndpoint from 'server/endpoint/base';
4
+
5
+ class RobotsEndpoint extends BaseEndpoint<unknown, string> {
6
+ public path = '/robots.txt';
7
+ public method = HttpMethod.GET;
8
+
9
+ public content_types = [
10
+ ContentType.TEXT
11
+ ];
12
+
13
+ protected async process(): Promise<string> {
14
+ return 'User-agent: *\nDisallow: /\n';
15
+ }
16
+ }
17
+
18
+ export default RobotsEndpoint;
@@ -0,0 +1,62 @@
1
+ import {StatusCode, HttpHeader, HttpMethod, ContentType} from 'lib/http';
2
+ import {InvalidError} from 'lib/errors';
3
+
4
+ import CreateSessionOperation from 'server/operation/create-session';
5
+ import BaseEndpoint from 'server/endpoint/base';
6
+ import Color from 'enum/color';
7
+ import createToastPath from 'server/utility/create-toast-path';
8
+
9
+ type CreateSessionInput = {
10
+ readonly username: string;
11
+ readonly password: string;
12
+ readonly source: string;
13
+ };
14
+
15
+ type CreateSessionOutput = string;
16
+
17
+ class CreateSessionEndpoint extends BaseEndpoint<CreateSessionInput, CreateSessionOutput> {
18
+ public path = '/session';
19
+ public method = HttpMethod.POST;
20
+ public content_types = [
21
+ ContentType.JSON,
22
+ ContentType.HTML
23
+ ];
24
+
25
+ protected async process(): Promise<CreateSessionOutput> {
26
+ const {username, password, source} = this.getRequestBody();
27
+
28
+ if (username === undefined) {
29
+ throw new InvalidError('Must specify a username');
30
+ }
31
+
32
+ if (password === undefined) {
33
+ throw new InvalidError('Must specify a password');
34
+ }
35
+
36
+ const execution_context = this.getExecutionContext();
37
+
38
+ const operation = new CreateSessionOperation(
39
+ username,
40
+ password,
41
+ execution_context
42
+ );
43
+
44
+ const session = await operation.perform();
45
+ const response = this.getResponse();
46
+ const target_path = decodeURIComponent(source);
47
+
48
+ const toasted_path = createToastPath(target_path, {
49
+ message: `welcome ${username}`,
50
+ color: Color.GREEN
51
+ });
52
+
53
+ response.setHeaderValue(HttpHeader.LOCATION, toasted_path);
54
+ response.setStatusCode(StatusCode.REDIRECT);
55
+
56
+ this.setSession(session);
57
+
58
+ return '';
59
+ }
60
+ }
61
+
62
+ export default CreateSessionEndpoint;
@@ -0,0 +1,40 @@
1
+ import {HttpMethod, ContentType} from 'lib/http';
2
+ import {UnauthorizedError} from 'lib/errors';
3
+
4
+ import SettingsResultSerializer from 'server/result-serializer/settings';
5
+ import BaseEndpoint from 'server/endpoint/base';
6
+ import AccountSettings from 'type/account-settings';
7
+ import LoadAccountOperation from 'server/operation/load-account';
8
+
9
+ type SettingsInput = {};
10
+ type SettingsOutput = AccountSettings;
11
+
12
+ class SettingsEndpoint extends BaseEndpoint<SettingsInput, SettingsOutput> {
13
+ public path = '/settings';
14
+ public method = HttpMethod.GET;
15
+ public content_types = [
16
+ ContentType.HTML
17
+ ];
18
+
19
+ protected async process(): Promise<SettingsOutput> {
20
+ const execution_context = this.getExecutionContext();
21
+ const operation = new LoadAccountOperation(execution_context);
22
+ const account = await operation.perform();
23
+
24
+ if (account === null) {
25
+ throw new UnauthorizedError();
26
+ }
27
+
28
+ return account.settings;
29
+ }
30
+
31
+ protected async getHtmlResultSerializer(result: SettingsOutput): Promise<SettingsResultSerializer> {
32
+ const session = this.getSession();
33
+ const path = '/settings';
34
+ const referrer_url = this.getReferrerUrl();
35
+
36
+ return new SettingsResultSerializer(result, path, referrer_url, session);
37
+ }
38
+ }
39
+
40
+ export default SettingsEndpoint;
@@ -0,0 +1,44 @@
1
+ import {StatusCode, HttpHeader, HttpMethod, ContentType} from 'lib/http';
2
+
3
+ import AccountSettings from 'type/account-settings';
4
+ import UpdateAccountSettingsOperation from 'server/operation/update-account-settings';
5
+ import BaseEndpoint from 'server/endpoint/base';
6
+ import Color from 'enum/color';
7
+ import createToastPath from 'server/utility/create-toast-path';
8
+
9
+ type UpdateSettingsInput = AccountSettings;
10
+ type UpdateSettingsOutput = string;
11
+
12
+ class UpdateSettingsEndpoint extends BaseEndpoint<UpdateSettingsInput, UpdateSettingsOutput> {
13
+ public path = '/settings';
14
+ public method = HttpMethod.POST;
15
+ public content_types = [
16
+ ContentType.JSON,
17
+ ContentType.HTML
18
+ ];
19
+
20
+ protected async process(): Promise<UpdateSettingsOutput> {
21
+ const path = createToastPath('/', {
22
+ message: 'settings updated',
23
+ color: Color.GREEN
24
+ });
25
+
26
+ const response = this.getResponse();
27
+ const body = this.getRequestBody();
28
+ const execution_context = this.getExecutionContext();
29
+
30
+ const operation = new UpdateAccountSettingsOperation(
31
+ body,
32
+ execution_context
33
+ );
34
+
35
+ await operation.perform();
36
+
37
+ response.setHeaderValue(HttpHeader.LOCATION, path);
38
+ response.setStatusCode(StatusCode.REDIRECT);
39
+
40
+ return '';
41
+ }
42
+ }
43
+
44
+ export default UpdateSettingsEndpoint;
@@ -0,0 +1,15 @@
1
+ import AbstractPageEndpoint from 'server/endpoint/abstract-page';
2
+ import createDate from 'server/utility/create-date';
3
+ import dateToPath from 'server/utility/date-to-path';
4
+
5
+ class TodayEndpoint extends AbstractPageEndpoint {
6
+ public path = '/today';
7
+
8
+ protected async determinePath(): Promise<string> {
9
+ const today = createDate();
10
+
11
+ return dateToPath(today);
12
+ }
13
+ }
14
+
15
+ export default TodayEndpoint;
@@ -0,0 +1,34 @@
1
+ import {HttpMethod, ContentType} from 'lib/http';
2
+
3
+ import BaseEndpoint from 'server/endpoint/base';
4
+ import Week from 'type/week';
5
+ import WeekResultSerializer from 'server/result-serializer/week';
6
+
7
+ class WeekEndpoint extends BaseEndpoint<unknown, Week> {
8
+ public path = '/week/:week';
9
+ public method = HttpMethod.GET;
10
+
11
+ public content_types = [
12
+ ContentType.HTML,
13
+ ContentType.JSON
14
+ ];
15
+
16
+ protected async process(): Promise<Week> {
17
+ const key = this.getPathParameter('week');
18
+
19
+ return {
20
+ key
21
+ };
22
+ }
23
+
24
+ protected async getHtmlResultSerializer(result: Week): Promise<WeekResultSerializer> {
25
+ const session = this.getSession();
26
+ const request = this.getRequest();
27
+ const path = request.getPath();
28
+ const referrer_url = this.getReferrerUrl();
29
+
30
+ return new WeekResultSerializer(result, path, referrer_url, session);
31
+ }
32
+ }
33
+
34
+ export default WeekEndpoint;
@@ -0,0 +1,34 @@
1
+ import {HttpMethod, ContentType} from 'lib/http';
2
+
3
+ import BaseEndpoint from 'server/endpoint/base';
4
+ import YearResultSerializer from 'server/result-serializer/year';
5
+ import Year from 'type/year';
6
+
7
+ class YearEndpoint extends BaseEndpoint<unknown, Year> {
8
+ public path = '/year/:year';
9
+ public method = HttpMethod.GET;
10
+
11
+ public content_types = [
12
+ ContentType.HTML,
13
+ ContentType.JSON
14
+ ];
15
+
16
+ protected async process(): Promise<Year> {
17
+ const key = this.getPathParameter('year');
18
+
19
+ return {
20
+ key
21
+ };
22
+ }
23
+
24
+ protected async getHtmlResultSerializer(result: Year): Promise<YearResultSerializer> {
25
+ const session = this.getSession();
26
+ const request = this.getRequest();
27
+ const path = request.getPath();
28
+ const referrer_url = this.getReferrerUrl();
29
+
30
+ return new YearResultSerializer(result, path, referrer_url, session);
31
+ }
32
+ }
33
+
34
+ export default YearEndpoint;