Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
7752a62
Modernize BookIT stack and preserve booking workflows
Portals Sep 6, 2026
94410d4
Fix stale booking details after calendar moves
Portals Sep 6, 2026
de1f023
Repair production Compose for the workspace deployment
Portals Sep 6, 2026
a2511fe
Make E2E scenarios focused and prefer accessible role selectors
Portals Sep 6, 2026
ae0d406
Improve date and time field accessibility with keyboard-friendly cont…
Portals Sep 6, 2026
f9911de
Improve dense calendar layouts and stress-test concurrent bookings
Portals Sep 6, 2026
2ba532f
Fix overlapping calendar labels and expose full rule details
Portals Sep 6, 2026
05acf95
Install the pinned pnpm version in CI jobs
Portals Sep 6, 2026
7c8f47e
Allow authorized edits of anonymized bookings with a new contact
Portals Sep 6, 2026
04c659d
Run CI E2E against published candidate image digests
Portals Sep 6, 2026
0e24b44
Remove obsolete setup files and redundant comments
Portals Sep 6, 2026
d5f8d4f
Remove development previews and one-off audit tooling
Portals Sep 6, 2026
afa5476
Restore a concise README matching the original structure
Portals Sep 6, 2026
86ba18b
Publish commit images and retag tested digests on GitHub releases
Portals Sep 6, 2026
2ad433f
Remove CodeQL workflow for now
Portals Sep 6, 2026
74ac345
Use commit image tags directly in E2E and releases
Portals Sep 6, 2026
f15dd2e
Remove Dependabot configuration for now
Portals Sep 6, 2026
de059b4
Remove booking transaction unit tests covered in part by E2E
Portals Sep 6, 2026
fb58353
Remove GraphQL unit tests while retaining E2E API coverage
Portals Sep 6, 2026
f9e571d
Remove session store unit tests
Portals Sep 6, 2026
7944977
Require braces and multiline formatting for control statements
Portals Sep 6, 2026
4f599c7
Limit stored OIDC session data and exposed user fields
Portals Sep 6, 2026
0eaf96f
Remove redundant event and rule model modules
Portals Sep 6, 2026
bf771f4
Remove E2E configuration-only unit tests
Portals Sep 6, 2026
3abf10f
Run E2E exclusively in containers through Make
Portals Sep 6, 2026
9617762
Exercise E2E flows exclusively through the browser UI
Portals Sep 6, 2026
fa2262f
Remove frontend API client unit tests
Portals Sep 6, 2026
2a9d5e3
Confirm calendar drag moves before saving bookings
Portals Sep 6, 2026
85e603a
Add breathing room throughout handwritten code
Portals Sep 6, 2026
814dc03
Use local Gamma for development supporting services
Portals Sep 6, 2026
03fc213
Handle expired sessions and preserve legacy OIDC secret configuration
Portals Sep 6, 2026
b5ee44c
Serve the frontend from a single BookIT application image
Portals Sep 6, 2026
dbe631e
Fix booking review findings and preserve main API compatibility
Portals Sep 6, 2026
05c5624
Unify UI utilities, theme tokens, and native selects
Portals Sep 6, 2026
99fa0f9
Integrate automatic cleanup, simplify tooling, and refresh theme
Portals Sep 6, 2026
b656cfa
Simplify CI and container startup with DB environment settings
Portals Sep 6, 2026
2414a2a
Check all codegen changes in CI and clarify deployment setup
Portals Sep 6, 2026
346bf0c
Publish images before E2E and use available calendar title space
Portals Sep 6, 2026
8d3cf78
Simplify README around current setup and usage
Portals Sep 6, 2026
38a351b
Smooth multi-room booking backgrounds with a uniform overlay
Portals Sep 6, 2026
d018c79
Align booking stripes across transparent borders
Portals Sep 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
.git
**/node_modules
**/.env
**/.env.*
!**/.env.example
**/build
**/dist
bookit/public
**/.vite
**/.cache
**/coverage
playwright-report
test-results
e2e
.codex
.agents
*.log
50 changes: 0 additions & 50 deletions .github/workflows/backend.yml

This file was deleted.

191 changes: 191 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,191 @@
name: CI

on:
pull_request:
branches: [main]
workflow_call:

permissions:
contents: read

concurrency:
group: ci-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

env:
CI: true

jobs:
quality:
name: Checks
runs-on: ubuntu-24.04
timeout-minutes: 20
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: voidzero-dev/setup-vp@49c3e4e92c52e7f8392712a9267bbe71c5ab30e5 # v1.19.0
with:
node-version: "24.19.0"
version: "0.3.0"
run-install: false
cache: true
- name: Install the packageManager-pinned pnpm
uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0
with:
run_install: false
- name: Install approved dependencies from the lockfile
run: vp install --frozen-lockfile
- name: Generate GraphQL contracts and check they are committed
shell: bash
run: |
pnpm codegen
if [[ -n "$(git status --porcelain --untracked-files=all)" ]]; then
echo "::error::pnpm codegen left repository changes. Regenerate and commit all generated output."
git status --short --untracked-files=all
git diff --no-ext-diff
git diff --cached --no-ext-diff
while IFS= read -r -d '' file; do
git diff --no-ext-diff --no-index -- /dev/null "$file" || true
done < <(git ls-files --others --exclude-standard -z)
exit 1
fi
- name: Generate Prisma client
run: pnpm --dir bookit exec prisma generate
- name: Check strict TypeScript contracts
run: pnpm typecheck
- name: Check formatting and type-aware lint
run: vp check
- name: Run unit tests
run: pnpm test
- name: Build BookIT
run: pnpm build
- name: Audit production and development dependencies
run: pnpm audit --audit-level low

publish:
name: Publish
needs: quality
runs-on: ubuntu-24.04
timeout-minutes: 20
permissions:
contents: read
packages: write
env:
BOOKIT_IMAGE: ghcr.io/cthit/bookit:${{ github.sha }}
CAN_PUBLISH: >-
${{ github.actor != 'dependabot[bot]' &&
(github.event_name != 'pull_request' ||
(github.event.pull_request.head.repo.full_name == github.repository &&
github.event.pull_request.user.login != 'dependabot[bot]')) }}
outputs:
image: ${{ steps.image.outputs.image }}
published: ${{ steps.image.outputs.published }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0
- name: Log in to GHCR
if: env.CAN_PUBLISH == 'true'
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build the BookIT image
id: build
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
with:
context: .
file: Dockerfile
platforms: linux/amd64
push: ${{ env.CAN_PUBLISH == 'true' }}
load: ${{ env.CAN_PUBLISH != 'true' }}
tags: ${{ env.BOOKIT_IMAGE }}
cache-from: type=gha,scope=bookit
cache-to: type=gha,mode=max,scope=bookit
- name: Pass the built image to E2E
id: image
shell: bash
env:
IMAGE_DIGEST: ${{ steps.build.outputs.digest }}
run: |
echo "published=$CAN_PUBLISH" >> "$GITHUB_OUTPUT"
if [[ "$CAN_PUBLISH" == true ]]; then
test -n "$IMAGE_DIGEST"
echo "image=ghcr.io/cthit/bookit@$IMAGE_DIGEST" >> "$GITHUB_OUTPUT"
else
echo "image=$BOOKIT_IMAGE" >> "$GITHUB_OUTPUT"
docker save --output "$RUNNER_TEMP/bookit.tar" "$BOOKIT_IMAGE"
fi
- name: Share the image for fork and Dependabot PRs
if: env.CAN_PUBLISH != 'true'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: bookit-image
path: ${{ runner.temp }}/bookit.tar
compression-level: 0
retention-days: 1
if-no-files-found: error

e2e:
name: E2E
needs: publish
permissions:
contents: read
packages: read
runs-on: ubuntu-24.04
timeout-minutes: 30
env:
BOOKIT_IMAGE: ${{ needs.publish.outputs.image }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: voidzero-dev/setup-vp@49c3e4e92c52e7f8392712a9267bbe71c5ab30e5 # v1.19.0
with:
node-version: "24.19.0"
version: "0.3.0"
run-install: false
cache: true
- name: Install the packageManager-pinned pnpm
uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0
with:
run_install: false
- run: vp install --frozen-lockfile
- name: Install Chromium and its system dependencies
run: pnpm exec playwright install --with-deps chromium
- name: Log in to GHCR
if: needs.publish.outputs.published == 'true'
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Pull the published image by digest
if: needs.publish.outputs.published == 'true'
run: docker pull --platform linux/amd64 "$BOOKIT_IMAGE"
- name: Download the image for fork and Dependabot PRs
if: needs.publish.outputs.published != 'true'
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: bookit-image
path: ${{ runner.temp }}
- name: Load the shared image
if: needs.publish.outputs.published != 'true'
run: docker load --input "$RUNNER_TEMP/bookit.tar"
- name: Run authenticated browser flows
shell: bash
run: pnpm test:e2e 2>&1 | tee e2e-run.log
- name: Preserve failing browser traces, screenshots, videos, and logs
if: failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: playwright-failure-artifacts
path: |
playwright-report/
test-results/
e2e-run.log
if-no-files-found: ignore
retention-days: 7
50 changes: 0 additions & 50 deletions .github/workflows/frontend.yml

This file was deleted.

23 changes: 23 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Main

on:
push:
branches: [main]
workflow_dispatch:

permissions:
contents: read

# Serialize publication and release tagging for the same commit.
concurrency:
group: images-${{ github.sha }}
cancel-in-progress: false

jobs:
validate:
name: Validate
if: github.ref == 'refs/heads/main'
uses: ./.github/workflows/ci.yml
permissions:
contents: read
packages: write
55 changes: 55 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: Release BookIT

on:
release:
types: [published]

permissions:
contents: read
actions: read
packages: write

concurrency:
group: images-${{ github.sha }}
cancel-in-progress: false

jobs:
release:
name: Tag tested BookIT image
runs-on: ubuntu-24.04
timeout-minutes: 10
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
RELEASE_TAG: ${{ github.event.release.tag_name }}
steps:
- name: Require successful main validation and publication
shell: bash
run: |
if [[ ! "$RELEASE_TAG" =~ ^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,127}$ ||
"$RELEASE_TAG" == latest || "$RELEASE_TAG" =~ ^[a-f0-9]{40}$ ]]; then
echo "Release tags must be valid Docker tags, not latest or a commit SHA." >&2
exit 1
fi
conclusion="$(gh api --method GET "repos/$GITHUB_REPOSITORY/actions/workflows/main.yml/runs" \
-f head_sha="$GITHUB_SHA" -f branch=main -f per_page=100 \
--jq '[.workflow_runs[] | select(.event == "push" or .event == "workflow_dispatch")][0].conclusion')"
if [[ "$conclusion" != success ]]; then
echo "The latest main validation and publication for $GITHUB_SHA must pass before releasing." >&2
exit 1
fi
- uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0
- name: Log in to GHCR
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Apply the release tag without rebuilding
shell: bash
run: |
repository="ghcr.io/cthit/bookit"
digest="$(docker buildx imagetools inspect "$repository:$GITHUB_SHA" --format '{{.Manifest.Digest}}')"
target="$repository:$RELEASE_TAG"
docker buildx imagetools create --prefer-index=false --tag "$target" "$repository@$digest"
actual="$(docker buildx imagetools inspect "$target" --format '{{.Manifest.Digest}}')"
test "$actual" = "$digest"
Loading
Loading