9 Commits

14 changed files with 8390 additions and 5410 deletions

1
.gitignore vendored
View File

@ -1,6 +1,7 @@
.DS_Store .DS_Store
.terraform .terraform
node_modules node_modules
/api/deploy
/web/dist /web/dist
/dist /dist

View File

@ -1,5 +1,4 @@
FROM 063932952339.dkr.ecr.us-west-2.amazonaws.com/alpine-nim:nim-1.6.10 AS build FROM 063932952339.dkr.ecr.us-west-2.amazonaws.com/alpine-nim:nim-1.6.10 AS build
MAINTAINER jonathan@jdbernard.com
COPY hff_entry_forms_api.nimble /hff_entry_forms_api/ COPY hff_entry_forms_api.nimble /hff_entry_forms_api/
COPY src /hff_entry_forms_api/src COPY src /hff_entry_forms_api/src

View File

@ -13,6 +13,8 @@ endif
# The server to target when publishing the API # The server to target when publishing the API
TARGET_SERVER ?= sobeck.jdb-software.com TARGET_SERVER ?= sobeck.jdb-software.com
TARGET_ENV ?= local
# The Notion integration token. # The Notion integration token.
AUTH_SECRET ?= 123abc AUTH_SECRET ?= 123abc
@ -90,19 +92,19 @@ echo-vars:
"PORT=$(PORT)\n" \ "PORT=$(PORT)\n" \
"INTEGRATION_TOKEN=$(INTEGRATION_TOKEN)\n" "INTEGRATION_TOKEN=$(INTEGRATION_TOKEN)\n"
publis: publish:
-rm -r deploy -rm -r deploy
-mkdir deploy -mkdir deploy
m4 \ m4 \
-D "HFF_ENTRY_FORMS_API_VERSION=$(VERSION)" \ -D "HFF_ENTRY_FORMS_API_VERSION=$(VERSION)" \
-D "TARGET_ENV=$(TARGET_ENV)" \ -D "TARGET_ENV=$(TARGET_ENV)" \
-D "TARGET_PORT=$(TARGET_PORT)" \ -D "TARGET_PORT=$(PORT)" \
hff_entry_forms_api.service \ hff_entry_forms_api.service \
> deploy/hff_entry_forms_api.$(TARGET_ENV).service > deploy/hff_entry_forms_api.$(TARGET_ENV).service
-ssh deployer@$(TARGET_SERVER) "docker stop hff_entry_forms.$(TARGET_ENV).service && sudo systemctl stop hff_entry_forms.$(TARGET_ENV)" -ssh deployer@$(TARGET_SERVER) "docker stop hff_entry_forms_api.$(TARGET_ENV).service && sudo systemctl stop hff_entry_forms_api.$(TARGET_ENV)"
ssh deployer@$(TARGET_SERVER) "aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin $(ECR_ACCOUNT_URL) && docker pull $(ECR_ACCOUNT_URL)/hff_entry_forms:$(VERSION)" ssh deployer@$(TARGET_SERVER) "aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin $(ECR_ACCOUNT_URL) && docker pull $(ECR_ACCOUNT_URL)/hff_entry_forms_api:$(VERSION)"
scp \ scp \
deploy/hff_entry_forms.$(TARGET_ENV).service \ deploy/hff_entry_forms_api.$(TARGET_ENV).service \
deployer@$(TARGET_SERVER):/etc/systemd/system/hff_entry_forms.$(TARGET_ENV).service deployer@$(TARGET_SERVER):/etc/systemd/system/hff_entry_forms_api.$(TARGET_ENV).service
ssh deployer@$(TARGET_SERVER) "sudo systemctl daemon-reload" ssh deployer@$(TARGET_SERVER) "sudo systemctl daemon-reload"
ssh deployer@$(TARGET_SERVER) "sudo systemctl start hff_entry_forms.$(TARGET_ENV)" ssh deployer@$(TARGET_SERVER) "sudo systemctl start hff_entry_forms_api.$(TARGET_ENV)"

View File

@ -1,6 +1,6 @@
# Package # Package
version = "0.3.2" version = "0.3.3-rc1"
author = "Jonathan Bernard" author = "Jonathan Bernard"
description = "Hope Family Fellowship entry forms." description = "Hope Family Fellowship entry forms."
license = "GPL-3.0-or-later" license = "GPL-3.0-or-later"

View File

@ -9,7 +9,7 @@ Restart=always
ExecStartPre=-/usr/bin/docker rm %n ExecStartPre=-/usr/bin/docker rm %n
ExecStart=/usr/bin/docker run --rm -p TARGET_PORT:80 --name %n \ ExecStart=/usr/bin/docker run --rm -p TARGET_PORT:80 --name %n \
--env-file /etc/hff_entry_forms/TARGET_ENV.env \ --env-file /etc/hff_entry_forms/TARGET_ENV.env \
063932952339.dkr.ecr.us-west-2.amazonaws.com/hff_entry_forms:HFF_ENTRY_FORMS_VERSION 063932952339.dkr.ecr.us-west-2.amazonaws.com/hff_entry_forms_api:HFF_ENTRY_FORMS_API_VERSION
ExecStop=/usr/bin/docker stop --name %n ExecStop=/usr/bin/docker stop --name %n
[Install] [Install]

View File

@ -1,4 +1,5 @@
import cliutils, docopt, json, logging, sequtils, strutils, tables import std/[json, logging, os, sequtils, strutils, tables]
import cliutils, docopt
import hff_entry_forms_apipkg/api import hff_entry_forms_apipkg/api
import hff_entry_forms_apipkg/version import hff_entry_forms_apipkg/version
@ -26,12 +27,13 @@ proc loadConfig(args: Table[string, docopt.Value]): HffEntryFormsApiConfig =
let cfg = CombinedConfig(docopt: args, json: json) let cfg = CombinedConfig(docopt: args, json: json)
result = HffEntryFormsApiConfig( result = HffEntryFormsApiConfig(
debug: args["--debug"], debug: cfg.hasKey("debug") and cfg.getVal("debug") == "true",
eventParentId: cfg.getVal("event-parent-id"), eventParentId: cfg.getVal("event-parent-id"),
integrationToken: cfg.getVal("integration-token"), integrationToken: cfg.getVal("integration-token"),
knownOrigins: cfg.getVal("known-origins")[1..^2].split(',').mapIt(it[1..^2]), knownOrigins: cfg.getVal("known-origins")[1..^2].split(',').mapIt(it.strip[1..^2]),
notionApiBaseUrl: cfg.getVal("notion-api-base-url"), notionApiBaseUrl: cfg.getVal("notion-api-base-url"),
notionVersion: cfg.getVal("notion-version"), notionVersion: cfg.getVal("notion-version"),
notionConfigDbId: cfg.getVal("notion-config-db-id"),
port: parseInt(cfg.getVal("port", "8300"))) port: parseInt(cfg.getVal("port", "8300")))
when isMainModule: when isMainModule:
@ -59,11 +61,11 @@ Options:
# Initialize our service context # Initialize our service context
let args = docopt(doc, version = HFF_ENTRY_FORMS_API_VERSION) let args = docopt(doc, version = HFF_ENTRY_FORMS_API_VERSION)
if args["--debug"]:
consoleLogger.levelThreshold = lvlDebug
let cfg = loadConfig(args) let cfg = loadConfig(args)
if cfg.debug:
consoleLogger.levelThreshold = lvlDebug
if args["serve"]: start(cfg) if args["serve"]: start(cfg)
except: except:

View File

@ -39,6 +39,8 @@ template jsonResp(code: HttpCode,
} }
else: @{:} else: @{:}
debug "Request origin: $#\nKnown origins: $#\nAdding headers:\n$#" %
[ reqOrigin, cfg.knownOrigins.join(" | "), $corsHeaders ]
halt( halt(
code, code,
headersToSend & corsHeaders & @{ headersToSend & corsHeaders & @{

View File

@ -11,7 +11,7 @@ proc getNotionClient(cfg: HffEntryFormsApiConfig): NotionClient =
notionClient = some(initNotionClient(NotionClientConfig( notionClient = some(initNotionClient(NotionClientConfig(
apiVersion: cfg.notionVersion, apiVersion: cfg.notionVersion,
apiBaseUrl: cfg.notionApiBaseUrl, apiBaseUrl: cfg.notionApiBaseUrl,
configDbId: "", configDbId: cfg.notionConfigDbId,
integrationToken: cfg.integrationToken))) integrationToken: cfg.integrationToken)))
return notionClient.get return notionClient.get

View File

@ -12,6 +12,7 @@ type
knownOrigins*: seq[string] knownOrigins*: seq[string]
notionApiBaseUrl*: string notionApiBaseUrl*: string
notionVersion*: string notionVersion*: string
notionConfigDbId*: string
port*: int port*: int
proc newApiError*(parent: ref Exception = nil, respCode: HttpCode, respMsg: string, msg = ""): ref ApiError = proc newApiError*(parent: ref Exception = nil, respCode: HttpCode, respMsg: string, msg = ""): ref ApiError =

View File

@ -1 +1 @@
const HFF_ENTRY_FORMS_API_VERSION* = "0.3.2" const HFF_ENTRY_FORMS_API_VERSION* = "0.3.3-rc1"

9931
web/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{ {
"name": "hff-entry-form-web", "name": "hff-entry-form-web",
"version": "0.3.2", "version": "0.3.3-rc1",
"private": true, "private": true,
"scripts": { "scripts": {
"serve": "npx servor dist", "serve": "npx servor dist",

View File

@ -1,4 +1,4 @@
import { defineComponent, Ref, ref } from 'vue'; import { defineComponent, ref } from 'vue';
import { logService } from '@jdbernard/logging'; import { logService } from '@jdbernard/logging';
import { import {
default as api, default as api,
@ -28,8 +28,8 @@ export default defineComponent({
props: {}, props: {},
components: { CircleCheckIcon, CircleCrossIcon, HourGlassIcon, SpinnerIcon }, components: { CircleCheckIcon, CircleCrossIcon, HourGlassIcon, SpinnerIcon },
setup: function TheProposeEventView() { setup: function TheProposeEventView() {
const departments: Ref<{ value: string; color: string }[]> = ref([]); const departments = ref<{ value: string; color: string }[]>([]);
const formState: Ref<FormState> = ref('loading'); const formState = ref<FormState>('loading');
setTimeout(async () => { setTimeout(async () => {
departments.value = (await api.getEventProposalConfig()).departments; departments.value = (await api.getEventProposalConfig()).departments;
@ -62,14 +62,14 @@ export default defineComponent({
if (await api.proposeEvent(formVal.event)) { if (await api.proposeEvent(formVal.event)) {
formState.value = 'success'; formState.value = 'success';
successes.push( successes.push(
`We've recorded the proposed details for ${formVal.event.name}.` `We've recorded the proposed details for ${formVal.event.name}.`,
); );
} else { } else {
formState.value = 'error'; formState.value = 'error';
errors.push( errors.push(
'We were unable to record the proposed details for ' + 'We were unable to record the proposed details for ' +
formVal.event.name + formVal.event.name +
". Poke Jonathan and tell him it's broken." ". Poke Jonathan and tell him it's broken.",
); );
} }

View File

@ -18,7 +18,11 @@
</label> </label>
<label> <label>
<span>Date and time</span> <span>Date and time</span>
<input type="date" name="date" v-model="formVal.event.date" /> <input
type="datetime-local"
name="date"
v-model="formVal.event.date"
/>
</label> </label>
<label> <label>
<span>Department / Event Type</span> <span>Department / Event Type</span>