@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.
- package/LICENSE +673 -0
- package/README.md +5 -0
- package/bin/compile +63 -0
- package/bin/copy-static-files +13 -0
- package/bin/install +5 -0
- package/bin/precompile +55 -0
- package/bin/prepublish +7 -0
- package/bin/remap-paths +113 -0
- package/bin/test +9 -0
- package/config/tsconfig.json +37 -0
- package/package.json +33 -0
- package/src/bootstrap/start.ts +12 -0
- package/src/client/bootstrap.ts +5 -0
- package/src/client/client.ts +54 -0
- package/src/client/enum/key-code.ts +34 -0
- package/src/client/enum/page-type.ts +19 -0
- package/src/client/factory/page.ts +61 -0
- package/src/client/page/confirm-delete-block.ts +30 -0
- package/src/client/page/create-block.ts +6 -0
- package/src/client/page/day.ts +8 -0
- package/src/client/page/edit-block.ts +43 -0
- package/src/client/page/edit-custom.ts +16 -0
- package/src/client/page/home.ts +8 -0
- package/src/client/page/login.ts +8 -0
- package/src/client/page/logout.ts +8 -0
- package/src/client/page/month.ts +8 -0
- package/src/client/page/move-block.ts +8 -0
- package/src/client/page/select-block-type.ts +56 -0
- package/src/client/page/settings.ts +8 -0
- package/src/client/page/view-custom.ts +665 -0
- package/src/client/page/week.ts +8 -0
- package/src/client/page/year.ts +8 -0
- package/src/client/page.ts +128 -0
- package/src/client/shim/execute.ts +5 -0
- package/src/client/shim/logger.ts +44 -0
- package/src/client/utility/get-meta-value.ts +23 -0
- package/src/common/builder/block/background.ts +25 -0
- package/src/common/builder/block/folder.ts +43 -0
- package/src/common/builder/block/header.ts +15 -0
- package/src/common/builder/block/link.ts +32 -0
- package/src/common/builder/block/multicolumn.ts +16 -0
- package/src/common/builder/block/note.ts +13 -0
- package/src/common/builder/block/whitespace.ts +13 -0
- package/src/common/utility/get-parent-path.ts +29 -0
- package/src/constant/month-names.ts +16 -0
- package/src/enum/action-type.ts +11 -0
- package/src/enum/block-type.ts +18 -0
- package/src/enum/calendar-view-mode.ts +9 -0
- package/src/enum/color.ts +15 -0
- package/src/enum/default-role.ts +6 -0
- package/src/enum/directory-item-type.ts +6 -0
- package/src/enum/emoji.ts +94 -0
- package/src/enum/field-type.ts +8 -0
- package/src/enum/header-size.ts +7 -0
- package/src/enum/permission-type.ts +8 -0
- package/src/enum/time-place-visibility.ts +8 -0
- package/src/enum/tool-type.ts +14 -0
- package/src/index.ts +8 -0
- package/src/interface/hydration-callback.ts +7 -0
- package/src/interface/provider.ts +8 -0
- package/src/interface/repository.ts +12 -0
- package/src/lib/array/add.ts +10 -0
- package/src/lib/array/assert-is-empty.ts +23 -0
- package/src/lib/array/clone.ts +5 -0
- package/src/lib/array/difference.ts +8 -0
- package/src/lib/array/empty.ts +6 -0
- package/src/lib/array/equal.ts +24 -0
- package/src/lib/array/get-first-value.ts +5 -0
- package/src/lib/array/get-last-value.ts +5 -0
- package/src/lib/array/get-max-value.ts +5 -0
- package/src/lib/array/get-value-after.ts +23 -0
- package/src/lib/array/get-value-before.ts +23 -0
- package/src/lib/array/get-values-between.ts +18 -0
- package/src/lib/array/index.ts +5 -0
- package/src/lib/array/is-empty.ts +6 -0
- package/src/lib/array/remove.ts +19 -0
- package/src/lib/array/sum.ts +11 -0
- package/src/lib/array/unique.ts +13 -0
- package/src/lib/environment/bootstrap.ts +1 -0
- package/src/lib/environment/enum/environment-type.ts +8 -0
- package/src/lib/environment/enum/service-type.ts +5 -0
- package/src/lib/environment/index.ts +7 -0
- package/src/lib/environment/utility/get-environment-type.ts +28 -0
- package/src/lib/environment/utility/is-browser.ts +5 -0
- package/src/lib/environment/utility/is-development.ts +10 -0
- package/src/lib/environment/utility/is-production-or-staging.ts +8 -0
- package/src/lib/environment/utility/is-production.ts +10 -0
- package/src/lib/environment/utility/is-staging.ts +10 -0
- package/src/lib/errors/enum/error-type.ts +13 -0
- package/src/lib/errors/error/base.ts +40 -0
- package/src/lib/errors/error/conflict.ts +16 -0
- package/src/lib/errors/error/generic.ts +23 -0
- package/src/lib/errors/error/invalid.ts +14 -0
- package/src/lib/errors/error/invariant-violation.ts +5 -0
- package/src/lib/errors/error/not-allowed.ts +14 -0
- package/src/lib/errors/error/not-found.ts +16 -0
- package/src/lib/errors/error/not-implemented.ts +20 -0
- package/src/lib/errors/error/omitted.ts +14 -0
- package/src/lib/errors/error/timeout.ts +14 -0
- package/src/lib/errors/error/unauthorized.ts +14 -0
- package/src/lib/errors/index.ts +18 -0
- package/src/lib/errors/sugar/invariant.ts +7 -0
- package/src/lib/errors/type/coded-error.ts +7 -0
- package/src/lib/errors/type/error-data.ts +11 -0
- package/src/lib/errors/utility/create-error-for-error-type.ts +60 -0
- package/src/lib/errors/utility/create-error-from-ambiguous-json-data.ts +26 -0
- package/src/lib/errors/utility/error-matches.ts +28 -0
- package/src/lib/errors/utility/get-error-type-for-posix-error-code.ts +37 -0
- package/src/lib/errors/utility/get-error-type-for-status-code.ts +38 -0
- package/src/lib/errors/utility/get-message-for-error-type.ts +29 -0
- package/src/lib/errors/utility/matches-posix-error-code.ts +11 -0
- package/src/lib/errors/utility/wrap-error.ts +39 -0
- package/src/lib/event-emitter/index.ts +63 -0
- package/src/lib/execution-context/execution-context.ts +90 -0
- package/src/lib/execution-context/index.ts +8 -0
- package/src/lib/execution-context/type/session.ts +7 -0
- package/src/lib/feature/feature.ts +108 -0
- package/src/lib/feature/index.ts +3 -0
- package/src/lib/filesystem/bootstrap.ts +1 -0
- package/src/lib/filesystem/enum/file-extension.ts +19 -0
- package/src/lib/filesystem/index.ts +4 -0
- package/src/lib/filesystem/utility/exists.ts +21 -0
- package/src/lib/filesystem/utility/get-extension-for-filepath.ts +20 -0
- package/src/lib/filesystem/utility/strip-extension.ts +26 -0
- package/src/lib/grammar/index.ts +3 -0
- package/src/lib/grammar/noun-inflector.ts +104 -0
- package/src/lib/grammar/utility/get-words-from-identifier.ts +9 -0
- package/src/lib/grammar/verb-inflector.ts +344 -0
- package/src/lib/http/buffer-stream.ts +76 -0
- package/src/lib/http/enum/content-type.ts +19 -0
- package/src/lib/http/enum/cookie-attribute.ts +11 -0
- package/src/lib/http/enum/header.ts +29 -0
- package/src/lib/http/enum/method.ts +11 -0
- package/src/lib/http/enum/same-site-policy.ts +7 -0
- package/src/lib/http/enum/status-code.ts +9 -0
- package/src/lib/http/factory/body-parser.ts +55 -0
- package/src/lib/http/index.ts +24 -0
- package/src/lib/http/interface/client-request.ts +15 -0
- package/src/lib/http/interface/incoming-message.ts +24 -0
- package/src/lib/http/interface/network-library.ts +9 -0
- package/src/lib/http/interface/request-callback.ts +7 -0
- package/src/lib/http/isomorphic/request.ts +77 -0
- package/src/lib/http/isomorphic/response.ts +77 -0
- package/src/lib/http/isomorphic.ts +20 -0
- package/src/lib/http/parser/accept-header.ts +35 -0
- package/src/lib/http/parser/basic-auth-header.ts +48 -0
- package/src/lib/http/parser/body/json.ts +14 -0
- package/src/lib/http/parser/body/multipart.ts +89 -0
- package/src/lib/http/parser/body/url-encoded.ts +16 -0
- package/src/lib/http/parser/body.ts +44 -0
- package/src/lib/http/parser/cookie.ts +114 -0
- package/src/lib/http/parser/querystring.ts +92 -0
- package/src/lib/http/parser/url.ts +76 -0
- package/src/lib/http/request/incoming.ts +299 -0
- package/src/lib/http/request/outgoing.ts +276 -0
- package/src/lib/http/request.ts +26 -0
- package/src/lib/http/response/incoming.ts +243 -0
- package/src/lib/http/response/outgoing.ts +160 -0
- package/src/lib/http/response.ts +74 -0
- package/src/lib/http/serializer/basic-auth-header.ts +27 -0
- package/src/lib/http/serializer/cookie.ts +90 -0
- package/src/lib/http/serializer/query-data.ts +54 -0
- package/src/lib/http/transaction.ts +320 -0
- package/src/lib/http/type/basic-auth-credentials.ts +6 -0
- package/src/lib/http/type/header-map.ts +5 -0
- package/src/lib/http/type/log-attributes.ts +12 -0
- package/src/lib/http/type/path-parameters.ts +5 -0
- package/src/lib/http/type/query-data.ts +7 -0
- package/src/lib/http/type/query-value.ts +11 -0
- package/src/lib/http/type/request-options.ts +16 -0
- package/src/lib/http/type/transaction-data.ts +4 -0
- package/src/lib/http/utility/get-content-type-for-extension.ts +47 -0
- package/src/lib/http/utility/get-library-for-protocol.ts +25 -0
- package/src/lib/http/utility/get-status-code-for-error-type.ts +37 -0
- package/src/lib/http/utility/get-status-code-for-error.ts +13 -0
- package/src/lib/http/utility/is-client-error-status.ts +15 -0
- package/src/lib/http/utility/is-error-status.ts +9 -0
- package/src/lib/http/utility/is-server-error-status.ts +7 -0
- package/src/lib/http/utility/is-success-status.ts +7 -0
- package/src/lib/http/utility/proxy-request.ts +58 -0
- package/src/lib/http/utility/serialize-request-options.ts +9 -0
- package/src/lib/http/utility/slug-generator.ts +20 -0
- package/src/lib/key-generator/index.ts +3 -0
- package/src/lib/key-generator/key-generator.ts +7 -0
- package/src/lib/logger/enum/ansi-escape-code.ts +14 -0
- package/src/lib/logger/enum/log-level.ts +8 -0
- package/src/lib/logger/formatter.ts +59 -0
- package/src/lib/logger/index.ts +7 -0
- package/src/lib/logger/interface/error-reporter.ts +7 -0
- package/src/lib/logger/interface/logger.ts +13 -0
- package/src/lib/logger/logger.ts +239 -0
- package/src/lib/logger/type/error-parameters.ts +9 -0
- package/src/lib/logger/type/loggable-data.ts +5 -0
- package/src/lib/logger/type/loggable-value.ts +1 -0
- package/src/lib/metrics/dispatcher.ts +264 -0
- package/src/lib/metrics/enum/dispatch-mode.ts +6 -0
- package/src/lib/metrics/index.ts +2 -0
- package/src/lib/metrics/settings-hydrator.ts +51 -0
- package/src/lib/metrics/type/dispatcher-settings.ts +12 -0
- package/src/lib/metrics/type/tag-map.ts +5 -0
- package/src/lib/network/bootstrap.ts +1 -0
- package/src/lib/network/enum/connection-status.ts +14 -0
- package/src/lib/network/enum/http-status-code.ts +75 -0
- package/src/lib/network/enum/network-protocol.ts +10 -0
- package/src/lib/network/event-emitter.ts +63 -0
- package/src/lib/network/index.ts +7 -0
- package/src/lib/network/interface/socket.ts +42 -0
- package/src/lib/network/type/socket-options.ts +6 -0
- package/src/lib/network/utility/get-protocol-from-url.ts +15 -0
- package/src/lib/operation/index.ts +6 -0
- package/src/lib/operation/operation/auto-logging.ts +94 -0
- package/src/lib/operation/operation/silent.ts +17 -0
- package/src/lib/operation/operation.ts +80 -0
- package/src/lib/process/bootstrap.ts +1 -0
- package/src/lib/process/enum/posix-error-code.ts +138 -0
- package/src/lib/process/enum/process-signal.ts +68 -0
- package/src/lib/process/error.ts +6 -0
- package/src/lib/process/execute.ts +77 -0
- package/src/lib/process/index.ts +4 -0
- package/src/lib/process/type/command-options.ts +9 -0
- package/src/lib/process/utility/bind-process-lifespan-to.ts +10 -0
- package/src/lib/promise-wrapper/index.ts +3 -0
- package/src/lib/promise-wrapper/promise-wrapper.ts +51 -0
- package/src/lib/random/chance.ts +5 -0
- package/src/lib/random/element.ts +7 -0
- package/src/lib/random/elements.ts +12 -0
- package/src/lib/random/enum.ts +34 -0
- package/src/lib/random/enums.ts +11 -0
- package/src/lib/random/index.ts +3 -0
- package/src/lib/random/number.ts +8 -0
- package/src/lib/server/base.ts +194 -0
- package/src/lib/server/enum/server-event.ts +5 -0
- package/src/lib/server/enum/server-status.ts +10 -0
- package/src/lib/server/http/endpoint/ping.ts +21 -0
- package/src/lib/server/http/endpoint.ts +345 -0
- package/src/lib/server/http/interface/endpoint-constructor.ts +12 -0
- package/src/lib/server/http/interface/result-serializer.ts +5 -0
- package/src/lib/server/http/middleware.ts +18 -0
- package/src/lib/server/http/result-serializer/html.ts +92 -0
- package/src/lib/server/http/result-serializer/json.ts +23 -0
- package/src/lib/server/http/route.ts +104 -0
- package/src/lib/server/http/router.ts +125 -0
- package/src/lib/server/http/type/session-resolver.ts +8 -0
- package/src/lib/server/http/utility/create-server.ts +34 -0
- package/src/lib/server/http/utility/path-parser.ts +49 -0
- package/src/lib/server/http/utility/standardize-html-indentation.ts +54 -0
- package/src/lib/server/http/websocket-wrapper.ts +83 -0
- package/src/lib/server/http.ts +301 -0
- package/src/lib/server/index.ts +5 -0
- package/src/lib/server/tcp.ts +53 -0
- package/src/lib/server/type/server-options.ts +10 -0
- package/src/lib/string/calculate-length.ts +17 -0
- package/src/lib/string/capitalize.ts +8 -0
- package/src/lib/string/create-slug.ts +14 -0
- package/src/lib/string/enum/ansi-escape-code.ts +14 -0
- package/src/lib/string/enum/string-encoding.ts +9 -0
- package/src/lib/string/hyphenate.ts +5 -0
- package/src/lib/string/index.ts +3 -0
- package/src/lib/string/pad.ts +14 -0
- package/src/lib/string/trim-multiline.ts +21 -0
- package/src/lib/string/trim.ts +8 -0
- package/src/lib/tcp/channel.ts +13 -0
- package/src/lib/tcp/connection/incoming.ts +72 -0
- package/src/lib/tcp/connection/outgoing.ts +219 -0
- package/src/lib/tcp/connection.ts +360 -0
- package/src/lib/tcp/enum/connection-event.ts +12 -0
- package/src/lib/tcp/enum/message-type.ts +9 -0
- package/src/lib/tcp/index.ts +1 -0
- package/src/lib/tcp/type/connection-parameters.ts +6 -0
- package/src/lib/tcp/type/message/channel-close.ts +9 -0
- package/src/lib/tcp/type/message/channel-open.ts +9 -0
- package/src/lib/tcp/type/message.ts +10 -0
- package/src/lib/test/index.ts +2 -0
- package/src/lib/test/utility/build-config.ts +17 -0
- package/src/lib/test/utility/build-execution-context.ts +11 -0
- package/src/lib/time/bootstrap.ts +1 -0
- package/src/lib/time/enum/time-interval.ts +12 -0
- package/src/lib/time/index.ts +4 -0
- package/src/lib/time/utility/format-duration.ts +139 -0
- package/src/lib/time/utility/format-relative-duration.ts +22 -0
- package/src/lib/time/utility/sleep.ts +9 -0
- package/src/operation.ts +18 -0
- package/src/server/endpoint/abstract-page.ts +126 -0
- package/src/server/endpoint/action/create.ts +545 -0
- package/src/server/endpoint/action/get.ts +231 -0
- package/src/server/endpoint/base.ts +51 -0
- package/src/server/endpoint/day.ts +13 -0
- package/src/server/endpoint/generic-page.ts +14 -0
- package/src/server/endpoint/index.ts +11 -0
- package/src/server/endpoint/login.ts +45 -0
- package/src/server/endpoint/logout.ts +38 -0
- package/src/server/endpoint/month.ts +35 -0
- package/src/server/endpoint/robots.ts +18 -0
- package/src/server/endpoint/session/create.ts +62 -0
- package/src/server/endpoint/settings/get.ts +40 -0
- package/src/server/endpoint/settings/update.ts +44 -0
- package/src/server/endpoint/today.ts +15 -0
- package/src/server/endpoint/week.ts +34 -0
- package/src/server/endpoint/year.ts +34 -0
- package/src/server/enum/custom-page-type.ts +10 -0
- package/src/server/factory/block-result-serializer.ts +115 -0
- package/src/server/middleware/base.ts +6 -0
- package/src/server/middleware/error-handler.ts +177 -0
- package/src/server/middleware/static-file.ts +83 -0
- package/src/server/operation/add-block.ts +110 -0
- package/src/server/operation/create-session.ts +43 -0
- package/src/server/operation/delete-block.ts +96 -0
- package/src/server/operation/demote-block.ts +108 -0
- package/src/server/operation/destroy-session.ts +26 -0
- package/src/server/operation/load-account.ts +30 -0
- package/src/server/operation/load-block.ts +48 -0
- package/src/server/operation/load-directory-items.ts +75 -0
- package/src/server/operation/load-page.ts +368 -0
- package/src/server/operation/promote-block.ts +104 -0
- package/src/server/operation/save-page.ts +60 -0
- package/src/server/operation/update-account-settings.ts +52 -0
- package/src/server/operation/update-block.ts +124 -0
- package/src/server/repository/memory.ts +112 -0
- package/src/server/result-serializer/action.ts +939 -0
- package/src/server/result-serializer/base.ts +1267 -0
- package/src/server/result-serializer/block/audio.ts +33 -0
- package/src/server/result-serializer/block/background.ts +20 -0
- package/src/server/result-serializer/block/calendar.ts +148 -0
- package/src/server/result-serializer/block/directory.ts +57 -0
- package/src/server/result-serializer/block/ephemeral.ts +14 -0
- package/src/server/result-serializer/block/folder.ts +106 -0
- package/src/server/result-serializer/block/header.ts +31 -0
- package/src/server/result-serializer/block/image.ts +46 -0
- package/src/server/result-serializer/block/link.ts +40 -0
- package/src/server/result-serializer/block/list.ts +140 -0
- package/src/server/result-serializer/block/multi-column.ts +97 -0
- package/src/server/result-serializer/block/note.ts +44 -0
- package/src/server/result-serializer/block/todo.ts +78 -0
- package/src/server/result-serializer/block/whitespace.ts +15 -0
- package/src/server/result-serializer/block.ts +248 -0
- package/src/server/result-serializer/common/time-place-options.ts +33 -0
- package/src/server/result-serializer/login.ts +58 -0
- package/src/server/result-serializer/month.ts +170 -0
- package/src/server/result-serializer/page.ts +548 -0
- package/src/server/result-serializer/settings.ts +85 -0
- package/src/server/result-serializer/week.ts +195 -0
- package/src/server/result-serializer/year.ts +160 -0
- package/src/server/utility/accepts-content-type.ts +16 -0
- package/src/server/utility/accepts-html.ts +9 -0
- package/src/server/utility/accepts-json.ts +9 -0
- package/src/server/utility/add-days.ts +11 -0
- package/src/server/utility/create-date.ts +23 -0
- package/src/server/utility/create-index-path.ts +5 -0
- package/src/server/utility/create-slug.ts +9 -0
- package/src/server/utility/create-toast-path.ts +19 -0
- package/src/server/utility/date-less-than.ts +5 -0
- package/src/server/utility/date-occurs-before.ts +22 -0
- package/src/server/utility/date-to-key.ts +7 -0
- package/src/server/utility/date-to-label.ts +5 -0
- package/src/server/utility/date-to-path.ts +9 -0
- package/src/server/utility/dates-are-equal.ts +22 -0
- package/src/server/utility/dates-are-in-order.ts +9 -0
- package/src/server/utility/dates-are-on-the-same-day.ts +9 -0
- package/src/server/utility/dates-in-same-month.ts +8 -0
- package/src/server/utility/day-to-date.ts +40 -0
- package/src/server/utility/decrement-date.ts +11 -0
- package/src/server/utility/get-block-at-index-path.ts +32 -0
- package/src/server/utility/get-block-permissions.ts +15 -0
- package/src/server/utility/get-compact-label-for-date.ts +8 -0
- package/src/server/utility/get-custom-page-type-for-path.ts +37 -0
- package/src/server/utility/get-element-id-for-block.ts +15 -0
- package/src/server/utility/get-emoji-for-block-type.ts +39 -0
- package/src/server/utility/get-emoji-for-tool-type.ts +20 -0
- package/src/server/utility/get-end-of-month.ts +13 -0
- package/src/server/utility/get-end-of-week.ts +13 -0
- package/src/server/utility/get-filepath-for-folder-block.ts +23 -0
- package/src/server/utility/get-hex-for-color.ts +31 -0
- package/src/server/utility/get-label-for-time-place-visibility.ts +23 -0
- package/src/server/utility/get-month-name.ts +18 -0
- package/src/server/utility/get-next-day.ts +7 -0
- package/src/server/utility/get-next-month.ts +12 -0
- package/src/server/utility/get-next-week.ts +12 -0
- package/src/server/utility/get-next-year.ts +13 -0
- package/src/server/utility/get-ordinal-label-for-week.ts +11 -0
- package/src/server/utility/get-ordinal-of-week-within-month.ts +15 -0
- package/src/server/utility/get-padded-date.ts +11 -0
- package/src/server/utility/get-parent-index-path.ts +18 -0
- package/src/server/utility/get-path-for-folder-block.ts +25 -0
- package/src/server/utility/get-path-from-url.ts +13 -0
- package/src/server/utility/get-previous-index-path.ts +27 -0
- package/src/server/utility/get-previous-month.ts +12 -0
- package/src/server/utility/get-previous-week.ts +11 -0
- package/src/server/utility/get-previous-year.ts +13 -0
- package/src/server/utility/get-random-emoji-for-date.ts +109 -0
- package/src/server/utility/get-short-label-for-date.ts +11 -0
- package/src/server/utility/get-short-month-name.ts +9 -0
- package/src/server/utility/get-short-ordinal.ts +26 -0
- package/src/server/utility/get-siblings-and-index-for-index-path.ts +67 -0
- package/src/server/utility/get-start-of-month.ts +11 -0
- package/src/server/utility/get-start-of-week.ts +12 -0
- package/src/server/utility/get-start-of-year.ts +12 -0
- package/src/server/utility/get-weekday-name.ts +24 -0
- package/src/server/utility/increment-date.ts +15 -0
- package/src/server/utility/is-index-path.ts +5 -0
- package/src/server/utility/key-to-date.ts +25 -0
- package/src/server/utility/month-has-week-containing-date.ts +13 -0
- package/src/server/utility/month-to-date.ts +28 -0
- package/src/server/utility/month-to-path.ts +10 -0
- package/src/server/utility/months-are-equal.ts +8 -0
- package/src/server/utility/parse-index-path.ts +23 -0
- package/src/server/utility/path-is-date.ts +13 -0
- package/src/server/utility/path-to-date.ts +24 -0
- package/src/server/utility/subtract-days.ts +7 -0
- package/src/server/utility/validate-month.ts +10 -0
- package/src/server/utility/validate-page.ts +46 -0
- package/src/server/utility/validate-path.ts +9 -0
- package/src/server/utility/validate-url.ts +12 -0
- package/src/server/utility/week-greater-than.ts +10 -0
- package/src/server/utility/week-to-date.ts +8 -0
- package/src/server/utility/week-to-path.ts +12 -0
- package/src/server/utility/weeks-are-equal.ts +8 -0
- package/src/server/utility/year-to-date.ts +26 -0
- package/src/server/utility/year-to-path.ts +7 -0
- package/src/server/utility/years-are-equal.ts +8 -0
- package/src/server.ts +140 -0
- package/src/test.ts +195 -0
- package/src/type/account-settings.ts +9 -0
- package/src/type/account.ts +11 -0
- package/src/type/action/add-block.ts +74 -0
- package/src/type/action/complete-block.ts +10 -0
- package/src/type/action/delete-block.ts +11 -0
- package/src/type/action/demote-block.ts +9 -0
- package/src/type/action/edit-block.ts +11 -0
- package/src/type/action/promote-block.ts +9 -0
- package/src/type/action.ts +9 -0
- package/src/type/block/audio.ts +8 -0
- package/src/type/block/background.ts +10 -0
- package/src/type/block/directory.ts +18 -0
- package/src/type/block/ephemeral.ts +9 -0
- package/src/type/block/folder.ts +14 -0
- package/src/type/block/header.ts +11 -0
- package/src/type/block/image.ts +8 -0
- package/src/type/block/link.ts +12 -0
- package/src/type/block/list.ts +24 -0
- package/src/type/block/multi-column.ts +10 -0
- package/src/type/block/note.ts +9 -0
- package/src/type/block/todo.ts +10 -0
- package/src/type/block/whitespace.ts +9 -0
- package/src/type/block-metadata.ts +14 -0
- package/src/type/block.ts +18 -0
- package/src/type/day.ts +5 -0
- package/src/type/field-definition.ts +8 -0
- package/src/type/field-value.ts +5 -0
- package/src/type/file.ts +6 -0
- package/src/type/month.ts +5 -0
- package/src/type/page.ts +8 -0
- package/src/type/price.ts +11 -0
- package/src/type/resource.ts +5 -0
- package/src/type/runtime-config.ts +13 -0
- package/src/type/server-settings.ts +17 -0
- package/src/type/toast.ts +8 -0
- package/src/type/week.ts +5 -0
- package/src/type/year.ts +5 -0
- package/test/unit/index.ts +11 -0
- 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,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;
|