various updates for docs env
ci.vdhsn.com/push Build is failing Details

pull/1/head
Adam Veldhousen 2023-06-12 16:28:24 -05:00
parent b40498b6ea
commit d23c22d294
Signed by: adam
GPG Key ID: 6DB29003C6DD1E4B
32 changed files with 359 additions and 863 deletions

View File

@ -7,7 +7,7 @@ trigger:
- push
steps:
- name: Build & Publish
- name: Build & Publish Catalog
image: plugins/kaniko
settings:
dockerfile: "./src/Dockerfile.prod-backend"
@ -23,29 +23,19 @@ steps:
no-push: true
tags:
- ${DRONE_COMMIT_SHA}
# ---
# kind: pipeline
# type: kubernetes
# name: Deploy beta
# trigger:
# event:
# - push
# branch:
# - trunk
# steps:
# - name: discord notification
# image: appleboy/drone-discord
# environment:
# DISCORD_WEBHOOK_ID:
# from_secret: DISCORD_WEBHOOK_ID
# DISCORD_WEBHOOK_TOKEN:
# from_secret: DISCORD_WEBHOOK_TOKEN
# settings:
# username: Drone CI
# message: Weekly Server Update Complete!
# webhook_id:
# from_secret: DISCORD_WEBHOOK_ID
# webhook_token:
# from_secret: DISCORD_WEBHOOK_TOKEN
- name: Build & Publish Runner
image: plugins/kaniko
settings:
dockerfile: "./src/Dockerfile.prod-backend"
context: "./src"
registry: git.vdhsn.com
repo: git.vdhsn.com/barretthousen/service-runner
username:
from_secret: DOCKER_USERNAME
password:
from_secret: DOCKER_PASSWORD
args:
- "service=runner"
no-push: true
tags:
- ${DRONE_COMMIT_SHA}

View File

@ -8,7 +8,8 @@ GOBIN = $(shell go env GOPATH)/bin
###################
.PHONY: setup
setup: $(GOBIN)/sqlc $(GOBIN)/buf ./env/.age.txt
setup: $(GOBIN)/sqlc $(GOBIN)/buf
@awk '{ print $$1 }' .tool-versions | xargs -I {} asdf plugin add {} || true
@asdf install || true
.PHONY: gen
@ -26,13 +27,15 @@ clobber:
KUBECONFIG=$(KUBECONFIG) ctlptl delete cluster kind-bh-local || true
@rm -f $(KUBECONFIG)
.PHONY: secrets
secrets: ./env/.age.txt
.PHONY: acceptance-test
acceptance-test:
docker run -it --rm \
-v $(pwd)/src/acceptance-tests.yml:/tests/tests.yml \
-e "TEST_HOST=bh.localhost" \
-e "TEST_ENV=local" \
-v $(PWD)/src/$(SERVICE)/acceptance-tests.yml:/tests/tests.yml \
-e "TEST_HOST=$(ORIGIN)" \
-e "TEST_ENV=prod" \
nytimes/httptest

View File

@ -2,71 +2,86 @@
Search and get alerts for items across the most popular auction sites.
Built with microservice architecture, for learning purposes
Built with microservice architecture and various fancy tools for learning purposes
### Links
- [Keybase Team Chat](keybase://team/barretthousen)
- [Source](https://git.vdhsn.com/Barretthousen/barretthousen)
- [Auction terms glossary](https://auctionsneapolitan.com/Auction-Terms-Glossary.html)
- [User's Site](https://barretthousen.com)
- [Admin Panel](https://admin.barretthousen.com)
### Goals
1. Ability to search upcoming and live auctions across major auction sites
2. Get an email digest of upcoming auctions for the week
Future goals
1. Get email alerts when these auctions are about to go live
2. Specify search criteria for email alerts
- [(Staging) User's Site](https://beta.barretthousen.com)
- [(Staging) Admin Panel](https://beta.admin.barretthousen.com)
## Technology
For Users
- [Prod](https://barretthousen.com)
- [Staging](https://beta.barretthousen.com)
This project is for fun and learning so there are a lot of tools at play:
For Admins
Infra
- [Tilt](https://tilt.dev): local development env orchestration
- [Ctlptl](https://github.com/tilt-dev/ctlptl): Automate local kubernetes clusters for local dev
- [Docker]()
- [Postgres]():
- [Traefik]():
- [Kustomize]():
- [Helm]():
- [Prod](https://beta.barretthousen.com)
- [Staging](https://admin.beta.barretthousen.com)
- [Architecture Diagram (use diagrams.net)](./doc/Barretthousen_mvp.drawio)
Backend
- [Go]()
- [goose](): Go SQL db migration tool
- [Sqlc](https://sqlc.dev/): Generate Go code to query SQL databases from migrations in a type safe way
- [Buf](): Nice frontend for protoc and .proto libraries
- [Protobufs]():
![Arcchitecure Diagram MVP](./doc/Barretthousen_mvp.drawio.svg)
Frontend
- [Typescript]():
- [SvelteKit](https://kit.svelte.dev/):
- [TailwindCSS]():
- [Diagram (use diagrams.net)](./doc/bh_design.drawio)
![Diagram](./doc/bh_design_overview.svg)
### Services
- Web-client
> [Auction terms glossary](https://auctionsneapolitan.com/Auction-Terms-Glossary.html)
- [Web-client](./src/web-client/)
Frontend site that users access to browse upcoming auctions and subscribe for updates to their searches
- Catalog
- [Admin-client](./src/admin-client/)
Enables site administrators to kicks off scrape and email jobs in Runner and Ringman, and view status on current/past jobs.
- [Catalog](./src/catalog/)
API for searching upcoming auctions.
- Ringman
Manages email subscriptions and sending emails to users about upcoming auctions.
- Runner
- [Runner](./src/runner/)
Scrapes sites for upcoming auctions.
Transforms the data into a suitable shape and stores it for use by the frontend.
- Auctioneer
Enables site administrators to kicks off scrape and email jobs in Runner and Ringman, and view status on current/past jobs.
- [Ringman](./src/ringman/)
Manages email subscriptions and sending emails to users about upcoming auctions.
- BHDB
Monolithic postgres datbabase tying it all together
- [Proxy-web](./src/proxy-web/)
Proxies JSON HTTP API requests for the web client to GRPC based services downstream
- [Proxy-admin](./src/proxy-admin/)
Proxies JSON HTTP API requests for the admin client to GRPC based services downstream
### Contributing
## Contributing
You will need the following prereqs installed:
- Docker
- Make
- [asdf](https://asdf-vm.com/guide/getting-started.html)
Install `asdf` and run `hack/asdf_plugin_setup`
Everything you need is in the makefile:
```sh
# install asdf tools, build tooling, encryption key for sops
# install asdf tools, sqlc, buf
make setup
# generate protobufs and sql boilerplate
@ -76,8 +91,14 @@ make gen
make dev
# build production docker images for the backend microservices, optionally push to the respective env
make build-backend-image SERVICE=[catalog, runner, proxy-client, proxy-admin] [ENV=[beta, prod]]
make build-backend-image SERVICE=[catalog, runner, proxy-web, proxy-admin] [ENV=[beta, prod]]
# build client docker image for web frontends, optionally push to the respective env
make build-client-image SERVICE=[web-client] [ENV=[beta, prod]]
make build-client-image SERVICE=[web-client, admin-client] [ENV=[beta, prod]]
# acceptance tests
make acceptance-test SERVICE=[runner,catalog] ORIGIN=[beta.barretthousen.com,beta.admin.barretthousen.com]
```
For how to deploy [read me](./doc/deployment.md).

View File

@ -51,32 +51,6 @@ helm_resource(
labels=["9-data"]
)
helm_resource(
'kafka',
'bitnami/kafka',
namespace='barretthousen-local',
flags=[
'--set', 'numIoThreads=1',
'--set', 'numNetworkThreads=1',
],
port_forwards=[port_forward(9092, 9092, name='kafka')],
resource_deps=['bitnami'],
labels=["9-data"]
)
helm_resource(
'kafka-ui',
'kafka-ui-github/kafka-ui',
namespace='barretthousen-local',
flags=[
'--set', 'envs.config.KAFKA_CLUSTERS_0_NAME=bh-kafka',
'--set', 'envs.config.KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka:9092'
],
port_forwards=[port_forward(9090, 8080, name='kafka-ui')],
resource_deps=['kafka'],
labels=["9-data"]
)
def bh_client(service="", port_forwards=[], labels=['2-services'], deps=['ingress']):
basepath = './src/{}-client'.format(service)
docker_build(
@ -84,6 +58,9 @@ def bh_client(service="", port_forwards=[], labels=['2-services'], deps=['ingres
context=basepath,
dockerfile='./src/Dockerfile.frontend'.format(service),
target='development',
build_args={
"service": service
},
entrypoint='vite dev --port=80 --host=0.0.0.0 --strictPort --logLevel info',
live_update=[
sync(basepath + '/src', '/opt/{}-client/src'.format(service)),
@ -141,7 +118,7 @@ def bh_backend_service(service="", port_forwards=[], migrateDB=False, devMode=Tr
'./src/runner',
'./src/catalog',
'./src/proxy-admin',
'./src/proxy-client',
'./src/proxy-web',
'./src/lib'
],
live_update=[
@ -168,7 +145,6 @@ k8s_resource(
)
bh_backend_service(service="runner", migrateDB=True, port_forwards=[
port_forward(2345, name='Delve port')
])
@ -181,7 +157,7 @@ bh_backend_service(service="proxy-admin", port_forwards=[
port_forward(8082, 80, name="HTTP API @ localhost:8082")
], deps=['ingress'])
bh_backend_service(service="proxy-client", port_forwards=[
bh_backend_service(service="proxy-web", port_forwards=[
port_forward(8081, 80, name="HTTP API @ localhost:8081")
], deps=['ingress'])

View File

@ -1,637 +0,0 @@
<mxfile host="app.diagrams.net" modified="2023-04-16T17:34:01.973Z" agent="Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0" etag="g01UfqVrYfXmJxj10a0k" version="21.1.7" type="device">
<diagram name="High level" id="BL8KaFisCtBiJRqkGTb9">
<mxGraphModel dx="3802" dy="1124" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="JNN8aSlnDbWN0y9jmZyT-1" value="&lt;div&gt;Web Client&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry y="110" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-39" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="JNN8aSlnDbWN0y9jmZyT-2" target="H4J2X_9uFRljxSkwpIMP-36">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-2" value="&lt;div&gt;Users&lt;/div&gt;" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-310" y="110" width="120" height="80" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0;entryDx=0;entryDy=52.5;entryPerimeter=0;" edge="1" parent="1" source="JNN8aSlnDbWN0y9jmZyT-3" target="JNN8aSlnDbWN0y9jmZyT-17">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-3" value="&lt;div&gt;Catalog&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="150" y="200" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-10" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1.013;exitY=0.613;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="JNN8aSlnDbWN0y9jmZyT-1" target="JNN8aSlnDbWN0y9jmZyT-3">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-80" y="130" as="sourcePoint" />
<mxPoint y="150" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0;entryDx=0;entryDy=52.5;entryPerimeter=0;" edge="1" parent="1" source="JNN8aSlnDbWN0y9jmZyT-11" target="JNN8aSlnDbWN0y9jmZyT-17">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-11" value="&lt;div&gt;Ringman&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="150" y="90" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-12" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.6;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="JNN8aSlnDbWN0y9jmZyT-1" target="JNN8aSlnDbWN0y9jmZyT-11">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-70" y="140" as="sourcePoint" />
<mxPoint x="10" y="300" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-17" value="&lt;div&gt;BHDB&lt;/div&gt;" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="1">
<mxGeometry x="470" y="110" width="60" height="80" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="JNN8aSlnDbWN0y9jmZyT-19" target="JNN8aSlnDbWN0y9jmZyT-17">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-19" value="&lt;div&gt;Runner&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="460" y="290" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-20" value="&lt;div&gt;Runner&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="470" y="300" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-21" value="&lt;div&gt;Runner&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="480" y="310" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-22" value="&lt;div&gt;Runner&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="490" y="320" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-26" value="&lt;div&gt;Catalog&lt;/div&gt;" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-190" y="440" width="180" height="90" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-27" value="GetUpcoming(searchCriteria)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-26">
<mxGeometry y="30" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-1" value="&lt;div&gt;CreateUpcoming(Sale)&lt;/div&gt;" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-26">
<mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-30" value="&lt;div&gt;Ringman&lt;/div&gt;" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry y="440" width="180" height="180" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-31" value="Subscribe(email)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-30">
<mxGeometry y="30" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-3" value="VerifySubscription(email,token)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-30">
<mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-32" value="&lt;div&gt;Unsubscribe(email)&lt;/div&gt;" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-30">
<mxGeometry y="90" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-33" value="&lt;div&gt;SendEmails()&lt;/div&gt;" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-30">
<mxGeometry y="120" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-34" value="GetJobs(searchCriteria)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-30">
<mxGeometry y="150" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-34" value="Runner" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="193" y="440" width="177" height="90" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-35" value="&lt;div&gt;FindNewUpcoming(criteria)&lt;br&gt;&lt;/div&gt;" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-34">
<mxGeometry y="30" width="177" height="30" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-1" value="GetJobs(searchCriteria)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-34">
<mxGeometry y="60" width="177" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-64" value="&lt;div&gt;Auction&lt;/div&gt;" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
<mxGeometry x="-190" y="680" width="180" height="300" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-65" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-64">
<mxGeometry y="30" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-66" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-65">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-67" value="ID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-65">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-68" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-64">
<mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-69" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-68">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-70" value="Title" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-68">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-71" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-64">
<mxGeometry y="90" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-72" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-71">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-73" value="Description" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-71">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-74" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-64">
<mxGeometry y="120" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-75" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-74">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-76" value="&lt;div&gt;StartTS&lt;/div&gt;" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-74">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-121" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-64">
<mxGeometry y="150" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-122" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-121">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-123" value="&lt;div&gt;EndTS&lt;/div&gt;" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-121">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-118" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-64">
<mxGeometry y="180" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-119" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-118">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-120" value="&lt;div&gt;SourceSiteName&lt;/div&gt;" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-118">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-81" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-64">
<mxGeometry y="210" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-82" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-81">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-83" value="&lt;div&gt;SourceURL&lt;/div&gt;" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-81">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-84" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-64">
<mxGeometry y="240" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-85" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-84">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-86" value="Photo1" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-84">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-87" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-64">
<mxGeometry y="270" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-88" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-87">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-89" value="Photo2" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-87">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-93" value="&lt;div&gt;User&lt;/div&gt;" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
<mxGeometry y="680" width="180" height="150" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-94" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-93">
<mxGeometry y="30" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-95" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-94">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-96" value="ID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-94">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-146" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-93">
<mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-147" value="UQ" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-146">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-148" value="EmailAddress" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-146">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-97" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-93">
<mxGeometry y="90" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-98" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-97">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-99" value="EmailVerifiedTS" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-97">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-4" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-93">
<mxGeometry y="120" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-5" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-4">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-6" value="CreatedTS" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-4">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-124" value="&lt;div&gt;ScrapeJob&lt;/div&gt;" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
<mxGeometry x="193" y="680" width="180" height="210" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-125" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-124">
<mxGeometry y="30" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-126" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-125">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-127" value="&lt;div&gt;ID&lt;/div&gt;" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-125">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-128" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;strokeColor=default;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-124">
<mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-129" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-128">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-130" value="StartedTS" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-128">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-131" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-124">
<mxGeometry y="90" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-132" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-131">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-133" value="CompletedTS" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-131">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-134" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-124">
<mxGeometry y="120" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-135" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-134">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-136" value="AuctionsFound" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-134">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-137" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-124">
<mxGeometry y="150" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-138" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-137">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-139" value="TargetSiteName" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-137">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-149" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-124">
<mxGeometry y="180" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-150" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-149">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-151" value="Errors" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-149">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-156" value="EmailSubscription" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
<mxGeometry y="840" width="180" height="150" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-157" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-156">
<mxGeometry y="30" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-158" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-157">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-159" value="ID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-157">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-178" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-156">
<mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-179" value="UQ" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-178">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-180" value="UserID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-178">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-175" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-156">
<mxGeometry y="90" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-176" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-175">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-177" value="&lt;div&gt;SearchCriteria&lt;/div&gt;" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=0;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-175">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-166" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-156">
<mxGeometry y="120" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-167" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;strokeColor=inherit;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-166">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-168" value="&lt;div&gt;LastSentTS&lt;/div&gt;" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-166">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="S1HCfoW5zDfGPMNCMrQO-7" target="JNN8aSlnDbWN0y9jmZyT-11">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-38" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="S1HCfoW5zDfGPMNCMrQO-7" target="JNN8aSlnDbWN0y9jmZyT-22">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="290" y="320" />
<mxPoint x="290" y="360" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0;entryDx=0;entryDy=52.5;entryPerimeter=0;" edge="1" parent="1" source="S1HCfoW5zDfGPMNCMrQO-7" target="JNN8aSlnDbWN0y9jmZyT-17">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="290" y="320" />
<mxPoint x="290" y="163" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-7" value="&lt;div&gt;Auctioneer&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry y="280" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-11" value="Auctioneer" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="388" y="440" width="182" height="120" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-12" value="&lt;div&gt;TriggerSendEmails&lt;/div&gt;" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-11">
<mxGeometry y="30" width="182" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-39" value="TriggerFindNewUpcoming" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-11">
<mxGeometry y="60" width="182" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-34" value="GetCommandHistory" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-11">
<mxGeometry y="90" width="182" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-13" value="CommandHistory" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
<mxGeometry x="388" y="680" width="180" height="240" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-14" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-13">
<mxGeometry y="30" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-15" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-14">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-16" value="&lt;div&gt;ID&lt;/div&gt;" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-14">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-17" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-13">
<mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-18" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-17">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-19" value="Name" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-17">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-35" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-13">
<mxGeometry y="90" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-36" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-35">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-37" value="Initiator" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-35">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-20" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-13">
<mxGeometry y="120" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-21" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-20">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-22" value="ExecutedTS" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-20">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-23" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-13">
<mxGeometry y="150" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-24" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-23">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-25" value="Target" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-23">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-26" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-13">
<mxGeometry y="180" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-27" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-26">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-28" value="Params" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-26">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-29" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-13">
<mxGeometry y="210" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-30" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-29">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-31" value="Errors" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-29">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-41" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="S1HCfoW5zDfGPMNCMrQO-32" target="H4J2X_9uFRljxSkwpIMP-38">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-32" value="Admin" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-310" y="280" width="120" height="80" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-3" value="SendEmailJob" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
<mxGeometry y="1000" width="180" height="180" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-4" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-3">
<mxGeometry y="30" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-5" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-4">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-6" value="ID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-4">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-19" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-3">
<mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-20" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-19">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-21" value="StartedTS" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=0;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-19">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-22" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-3">
<mxGeometry y="90" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-23" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-22">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-24" value="CompletedTS" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=0;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-22">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-25" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-3">
<mxGeometry y="120" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-26" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-25">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-27" value="EmailsSent" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=0;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-25">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-28" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-3">
<mxGeometry y="150" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-29" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-28">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-30" value="Errors" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=0;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-28">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-40" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="H4J2X_9uFRljxSkwpIMP-36" target="JNN8aSlnDbWN0y9jmZyT-1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-36" value="&lt;div&gt;@&lt;/div&gt;&lt;div&gt;alpha&lt;/div&gt;&lt;div&gt;beta&lt;br&gt;&lt;/div&gt;" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.direct_data;whiteSpace=wrap;align=center;" vertex="1" parent="1">
<mxGeometry x="-170" y="120" width="140" height="60" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-42" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="H4J2X_9uFRljxSkwpIMP-38" target="S1HCfoW5zDfGPMNCMrQO-7">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-38" value="&lt;div&gt;admin&lt;/div&gt;&lt;div&gt;alpha-admin&lt;/div&gt;&lt;div&gt;beta-admin&lt;br&gt;&lt;/div&gt;" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.direct_data;whiteSpace=wrap;align=center;" vertex="1" parent="1">
<mxGeometry x="-160" y="290" width="130" height="60" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-43" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#00188D;shape=mxgraph.mscae.enterprise.lock" vertex="1" parent="1">
<mxGeometry x="-119" y="240" width="39" height="50" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-44" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#00188D;shape=mxgraph.mscae.enterprise.lock_unlocked" vertex="1" parent="1">
<mxGeometry x="-119" y="70" width="37" height="50" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-51" value="Web Client" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-380" y="440" width="180" height="90" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-52" value="SearchPage" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-51">
<mxGeometry y="30" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-53" value="SubscriptionsPage" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-51">
<mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 183 KiB

177
doc/bh_design.drawio Normal file
View File

@ -0,0 +1,177 @@
<mxfile host="app.diagrams.net" modified="2023-06-12T21:54:22.543Z" agent="Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/112.0" etag="x7K_nP_hUPP84gUb8Ro3" version="21.1.7" type="device">
<diagram name="High level" id="BL8KaFisCtBiJRqkGTb9">
<mxGraphModel dx="2053" dy="1131" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="JNN8aSlnDbWN0y9jmZyT-1" value="&lt;div&gt;Web Client&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
<mxGeometry x="-320" y="70" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="JNN8aSlnDbWN0y9jmZyT-2" target="wSJkOsJQY9M_Z095WERL-4">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-2" value="&lt;div&gt;Users&lt;/div&gt;" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="-840" y="110" width="120" height="80" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-17" value="&lt;div&gt;catalog-db&lt;/div&gt;" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" parent="1" vertex="1">
<mxGeometry x="80" y="57.5" width="80" height="105" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-54" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="JNN8aSlnDbWN0y9jmZyT-19" target="wSJkOsJQY9M_Z095WERL-50">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-19" value="&lt;div&gt;Runner&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
<mxGeometry x="-60" y="440" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="S1HCfoW5zDfGPMNCMrQO-32" target="wSJkOsJQY9M_Z095WERL-8">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-32" value="Admin" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="-830" y="400" width="120" height="80" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-4" target="JNN8aSlnDbWN0y9jmZyT-1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-21" value="&lt;div&gt;Path: /&lt;/div&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="wSJkOsJQY9M_Z095WERL-19">
<mxGeometry x="0.4522" y="-2" relative="1" as="geometry">
<mxPoint x="1" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-4" target="wSJkOsJQY9M_Z095WERL-18">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-22" value="Path: /api" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="wSJkOsJQY9M_Z095WERL-20">
<mxGeometry x="0.3611" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-4" value="bh.com" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.direct_data;whiteSpace=wrap;align=center;" vertex="1" parent="1">
<mxGeometry x="-640.5" y="120" width="160" height="60" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-5" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#00188D;shape=mxgraph.mscae.enterprise.lock_unlocked" vertex="1" parent="1">
<mxGeometry x="-579" y="70" width="37" height="50" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-8" target="wSJkOsJQY9M_Z095WERL-13">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-25" value="&lt;div&gt;Path:/&lt;/div&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="wSJkOsJQY9M_Z095WERL-23">
<mxGeometry x="0.43" y="-2" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-8" target="wSJkOsJQY9M_Z095WERL-17">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-26" value="Path:/api" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="wSJkOsJQY9M_Z095WERL-24">
<mxGeometry x="0.3263" y="-1" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-8" value="&lt;div&gt;admin.bh.com&lt;/div&gt;" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.direct_data;whiteSpace=wrap;align=center;" vertex="1" parent="1">
<mxGeometry x="-630.5" y="410" width="160.5" height="60" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-9" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#00188D;shape=mxgraph.mscae.enterprise.lock" vertex="1" parent="1">
<mxGeometry x="-570" y="360" width="39" height="50" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-13" value="Admin Client" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="-320" y="350" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-30" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-17" target="JNN8aSlnDbWN0y9jmZyT-19">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-31" value="&lt;div&gt;/v1/sync&lt;/div&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="wSJkOsJQY9M_Z095WERL-30">
<mxGeometry x="0.2947" y="1" relative="1" as="geometry">
<mxPoint y="-9" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-46" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-17" target="wSJkOsJQY9M_Z095WERL-42">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-190" y="480" />
<mxPoint x="-190" y="290" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-47" value="&lt;div&gt;/v1/notify&lt;/div&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="wSJkOsJQY9M_Z095WERL-46">
<mxGeometry x="-0.359" relative="1" as="geometry">
<mxPoint x="70" y="-111" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-17" value="&lt;div&gt;Proxy Admin&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="-320" y="440" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-18" target="wSJkOsJQY9M_Z095WERL-27">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-190" y="200" />
<mxPoint x="-190" y="110" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-29" value="&lt;div&gt;/v1/upcoming&lt;/div&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="wSJkOsJQY9M_Z095WERL-28">
<mxGeometry x="-0.2889" y="-2" relative="1" as="geometry">
<mxPoint x="58" y="-63" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-43" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-18" target="wSJkOsJQY9M_Z095WERL-42">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-190" y="200" />
<mxPoint x="-190" y="290" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-45" value="&lt;div&gt;/v1/register&lt;/div&gt;&lt;div&gt;/v1/verify&lt;/div&gt;&lt;div&gt;/v1/unsubscribe&lt;br&gt;&lt;/div&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="wSJkOsJQY9M_Z095WERL-43">
<mxGeometry x="0.3185" relative="1" as="geometry">
<mxPoint x="32" y="-30" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-18" value="Proxy Web" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="-320" y="160" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-55" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-27" target="JNN8aSlnDbWN0y9jmZyT-17">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-27" value="&lt;div&gt;Catalog&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="-70" y="70" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-52" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-42" target="wSJkOsJQY9M_Z095WERL-49">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-42" value="&lt;div&gt;Ringman&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="-60" y="250" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-49" value="ringman-db" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="1">
<mxGeometry x="80" y="237.5" width="80" height="105" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-50" value="runner-db" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="1">
<mxGeometry x="80" y="427.5" width="80" height="105" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-57" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-56" target="wSJkOsJQY9M_Z095WERL-17">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-58" value="curl /api/v1/sync" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="wSJkOsJQY9M_Z095WERL-57">
<mxGeometry x="0.275" y="-2" relative="1" as="geometry">
<mxPoint x="58" y="41" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-56" value="&lt;div&gt;sync-cronjob&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="-320" y="600" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-61" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-59" target="wSJkOsJQY9M_Z095WERL-17">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-120" y="560" />
<mxPoint x="-280" y="560" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-59" value="&lt;div&gt;notify-cronjob&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="-160" y="600" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-60" value="curl /api/v1/notify" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="1">
<mxGeometry x="-70" y="580" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 36 KiB

View File

@ -5,7 +5,7 @@ Services deployed (using kustomize):
- [catalog](./src/catalog)
- [runner](./src/runner)
- [proxy-admin](./src/proxy-admin)
- [proxy-client](./src/proxy-client)
- [proxy-web](./src/proxy-web)
- [web-client](./src/web-client)
- [admin-client](./src/admin-client)
@ -61,7 +61,7 @@ helm install --upgrade bh-db bitnami/postgresql -n 'barretthousen-beta' \
make build-backend-image SERVICE=catalog ENV=beta
make build-backend-image SERVICE=runner ENV=beta
make build-backend-image SERVICE=proxy-admin ENV=beta
make build-backend-image SERVICE=proxy-client ENV=beta
make build-backend-image SERVICE=proxy-web ENV=beta
make build-client-image SERVICE=web-client ENV=beta ORIGIN=https://beta.barretthousen.com
make build-client-image SERVICE=admin-client ENV=beta ORIGIN=https://beta.admin.barretthousen.com
@ -78,8 +78,8 @@ kubectl rollout status -n barretthousen-beta deployment catalog-beta -w
kubectl rollout restart -n barretthousen-beta deployment proxy-admin-beta
kubectl rollout status -n barretthousen-beta deployment proxy-admin-beta -w
kubectl rollout restart -n barretthousen-beta deployment proxy-client-beta
kubectl rollout status -n barretthousen-beta deployment proxy-client-beta -w
kubectl rollout restart -n barretthousen-beta deployment proxy-web-beta
kubectl rollout status -n barretthousen-beta deployment proxy-web-beta -w
kubectl rollout restart -n barretthousen-beta deployment web-client-beta
kubectl rollout status -n barretthousen-beta deployment web-client-beta -w

View File

@ -13,7 +13,7 @@ spec:
path: "/api"
backend:
service:
name: proxy-client
name: proxy-web
port:
number: 80
- pathType: ImplementationSpecific

View File

@ -4,7 +4,7 @@ resources:
- ./catalog-deployment.yaml
- ./runner-deployment.yaml
- ./proxy-admin-deployment.yaml
- ./proxy-client-deployment.yaml
- ./proxy-web-deployment.yaml
- ./sync-cronjob.yaml
- ./web-client-deployment.yaml
- ./admin-client-deployment.yaml

View File

@ -1,45 +1,45 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: proxy-client
name: proxy-web
spec:
selector:
matchLabels:
service: proxy-client
service: proxy-web
template:
metadata:
labels:
service: proxy-client
service: proxy-web
spec:
serviceAccountName: barretthousen-service
containers:
- name: proxy-client
image: barretthousen/service-proxy-client:latest
- name: proxy-web
image: barretthousen/service-proxy-web:latest
imagePullPolicy: Always
ports:
- containerPort: 80
name: http
command:
- /opt/proxy-client
- /opt/proxy-web
resources:
limits:
memory: "128Mi"
cpu: "250m"
volumeMounts:
- name: proxy-client-config
- name: proxy-web-config
mountPath: /config/
volumes:
- name: proxy-client-config
- name: proxy-web-config
secret:
secretName: proxy-client-config
secretName: proxy-web-config
---
apiVersion: v1
kind: Service
metadata:
name: proxy-client
name: proxy-web
spec:
selector:
service: proxy-client
service: proxy-web
ports:
- port: 80
targetPort: 80
@ -47,7 +47,7 @@ spec:
apiVersion: v1
kind: Secret
metadata:
name: proxy-client-config
name: proxy-web-config
stringData:
config.yaml: |
log_level: 2

View File

@ -9,7 +9,7 @@ patchesStrategicMerge:
- sync-cronjob.yaml
- catalog-secret.yaml
- proxy-admin-secret.yaml
- proxy-client-secret.yaml
- proxy-web-secret.yaml
- runner-secret.yaml
patches:
@ -62,11 +62,11 @@ patches:
- target:
kind: Deployment
name: proxy-client
name: proxy-web
patch: |-
- op: replace
path: /spec/template/spec/containers/0/image
value: git.vdhsn.com/barretthousen/service-proxy-client:beta
value: git.vdhsn.com/barretthousen/service-proxy-web:beta
- target:
kind: Deployment
name: web-client

View File

@ -1,7 +1,7 @@
apiVersion: v1
kind: Secret
metadata:
name: proxy-client-config
name: proxy-web-config
stringData:
config.yaml: |
log_level: 2

8
env/local/image-pull-secret.yaml vendored Normal file
View File

@ -0,0 +1,8 @@
apiVersion: v1
kind: Secret
metadata:
name: bh-registry
type: kubernetes.io/dockerconfigjson
stringData:
.dockerconfigjson: |
{ "auths": {} }

View File

@ -11,6 +11,7 @@ patchesStrategicMerge:
- debug-catalog.yaml
- debug-runner.yaml
- sync-cronjob.yaml
- image-pull-secret.yaml
patches:
- target:

View File

@ -9,7 +9,7 @@ patchesStrategicMerge:
- sync-cronjob.yaml
- catalog-configmap.yaml
- proxy-admin-configmap.yaml
- proxy-client-configmap.yaml
- proxy-web-configmap.yaml
- runner-configmap.yaml
patches:
@ -50,11 +50,11 @@ patches:
value: git.vdhsn.com/barretthousen/service-proxy-admin:prod
- target:
kind: Deployment
name: proxy-client
name: proxy-web
patch: |-
- op: replace
path: /spec/template/spec/containers/0/image
value: git.vdhsn.com/barretthousen/service-proxy-client:prod
value: git.vdhsn.com/barretthousen/service-proxy-web:prod
- target:
kind: Deployment
name: web-client

View File

@ -1,7 +1,7 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: proxy-client-config
name: proxy-web-config
data:
config.yaml: |
log_level: 2

View File

@ -4,6 +4,6 @@ use (
./src/catalog
./src/lib
./src/proxy-admin
./src/proxy-client
./src/proxy-web
./src/runner
)

View File

@ -163,7 +163,8 @@ github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5
github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI=
github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0=
github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A=
github.com/jackc/puddle v1.3.0 h1:eHK/5clGOatcjX3oWGBO/MpxpbHzSwud5EWTSCI+MX0=
github.com/klauspost/compress v1.16.4 h1:91KN02FnsOYhuunwU4ssRe8lc2JosWmizWa91B5v1PU=
github.com/pierrec/lz4/v4 v4.1.17 h1:kV4Ip+/hUBC+8T6+2EgburRtkE9ef4nbY3f4dFhGjMc=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
go.uber.org/dig v1.0.0/go.mod h1:z+dSd2TP9Usi48jL8M3v63iSBVkiwtVyMKxMZYYauPg=

View File

@ -1,2 +1 @@
web-client
.idea

View File

@ -1,4 +0,0 @@
FROM golang:1.19-alpine as builder
RUN go install github.com/bufbuild/buf/cmd/buf@v1.17.0
RUN go install github.com/kyleconroy/sqlc/cmd/sqlc@latest

View File

@ -1,38 +1,12 @@
# create-svelte
# Admin client
Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/master/packages/create-svelte).
Admin panel to drive backend "administrative" functionality
## Creating a project
Uses [SvelteKit](), [TailwindCSS](), [Typescript (poorly)]()
If you're seeing this, you've probably already done this step. Congrats!
```bash
# create a new project in the current directory
npm create svelte@latest
## Development
# create a new project in my-app
npm create svelte@latest my-app
```
Follow the [Contributing section](../../README.md#contributing) to get the environment stood up locally.
## Developing
Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
```bash
npm run dev
# or start the server and open the app in a new browser tab
npm run dev -- --open
```
## Building
To create a production version of your app:
```bash
npm run build
```
You can preview the production build with `npm run preview`.
> To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment.
Browse to [http://admin.localhost:8000](http://admin.localhost:8000).

View File

@ -1,16 +1,7 @@
tests:
- description: "trigger scrape"
- description: "Search for top"
request:
path: "/v1/findNewUpcoming"
method: "POST"
headers:
authorization: "token ${SECRET_AUTH_TOKEN}"
response:
statusCodes: [200]
- description: "get list of jobs"
request:
path: "/v1/jobs"
headers:
authorization: "token ${SECRET_AUTH_TOKEN}"
path: "/api/v1/upcoming"
method: "GET"
response:
statusCodes: [200]

View File

@ -1,3 +1,16 @@
log_level: ERROR
service: {}
log_level: 2
port: 5001
db_service:
scheme: postgres
port: 5432
host: bh-db
name: bh
user: catalog-service
password: catalog-service
db_migrate:
scheme: postgres
port: 5432
host: bh-db
name: bh
user: postgres
password: bh-admin

View File

@ -1,4 +1,4 @@
module git.vdhsn.com/barretthousen/barretthousen/src/proxy-client
module git.vdhsn.com/barretthousen/barretthousen/src/proxy-web
go 1.19

View File

@ -1,16 +1,12 @@
tests:
- description: "trigger scrape"
- description: "trigger sync"
request:
path: "/v1/findNewUpcoming"
method: "POST"
headers:
authorization: "token ${SECRET_AUTH_TOKEN}"
path: "/v1/sync"
method: "PUT"
response:
statusCodes: [200]
- description: "get list of jobs"
request:
path: "/v1/jobs"
headers:
authorization: "token ${SECRET_AUTH_TOKEN}"
path: "/v1/sync"
response:
statusCodes: [200]

View File

@ -1,3 +1,16 @@
log_level: ERROR
service: {}
log_level: 2
port: 5001
db_service:
scheme: postgres
port: 5432
host: bh-db
name: bh
user: runner-service
password: runner-service
db_migrate:
scheme: postgres
port: 5432
host: bh-db
name: bh
user: postgres
password: bh-admin

View File

@ -1,38 +1,12 @@
# create-svelte
# Web client
Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/master/packages/create-svelte).
A SSR web app that allows users to search for upcoming auctions
## Creating a project
Uses [SvelteKit](), [TailwindCSS](), [Typescript (poorly)]()
If you're seeing this, you've probably already done this step. Congrats!
```bash
# create a new project in the current directory
npm create svelte@latest
## Development
# create a new project in my-app
npm create svelte@latest my-app
```
Follow the [Contributing section](../../README.md#contributing) to get the environment stood up locally.
## Developing
Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
```bash
npm run dev
# or start the server and open the app in a new browser tab
npm run dev -- --open
```
## Building
To create a production version of your app:
```bash
npm run build
```
You can preview the production build with `npm run preview`.
> To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment.
Browse to [http://bh.localhost:8000](http://bh.localhost:8000).

View File

@ -2,7 +2,7 @@ import { browser } from '$app/environment';
import type { PageLoad } from './$types';
// TODO: change to env var
const API_HOST = `${browser ? '' : 'http://proxy-client-local'}/api/v1`;
const API_HOST = `${browser ? '' : 'http://proxy-web-local'}/api/v1`;
interface SearchPageData {
page: number;