Capture testing DB snapshot and reset staging DB baseline
This commit is contained in:
parent
c7af591f02
commit
b1cee2c0d7
3 changed files with 369 additions and 1 deletions
|
|
@ -26,6 +26,7 @@
|
|||
- `creds/` and `k3s.yaml` are git-ignored; contains joker DYNDNS creds and registry auth.
|
||||
|
||||
# Lomavuokraus app progress (Nov 24)
|
||||
- New testing DB (`lomavuokraus_testing`) holds the previous staging/prod data; the main `lomavuokraus` DB was recreated clean with only the seeded admin user. Migration history was copied, and a schema snapshot lives at `docs/db-schema.sql`.
|
||||
- Backend/data: Added Prisma models (User/Listing/ListingTranslation/ListingImage), seed script creates sample listing; DB on Hetzner VM `46.62.203.202`, staging secrets set in `lomavuokraus-web-secrets`.
|
||||
- Auth: Register/login/verify flows; session cookie (`session_token`), NavBar shows email+role badge. Roles: USER, ADMIN, USER_MODERATOR (approve users), LISTING_MODERATOR (approve listings). Admin can change roles at `/admin/users`.
|
||||
- Listing flow: create listing (session required), pending/published with admin/moderator approvals; pages for “My listings,” “New listing,” “Profile.” Quick actions tile removed; all actions in navbar.
|
||||
|
|
|
|||
367
docs/db-schema.sql
Normal file
367
docs/db-schema.sql
Normal file
|
|
@ -0,0 +1,367 @@
|
|||
--
|
||||
-- PostgreSQL database dump
|
||||
--
|
||||
|
||||
\restrict V6pdk4hxHk7VQYnrn2NO7clngbg01PyshHFsoDbbbQ28wtOAfkiTfl6BQQ0BtLG
|
||||
|
||||
-- Dumped from database version 16.10 (Ubuntu 16.10-0ubuntu0.24.04.1)
|
||||
-- Dumped by pg_dump version 16.11 (Ubuntu 16.11-0ubuntu0.24.04.1)
|
||||
|
||||
SET statement_timeout = 0;
|
||||
SET lock_timeout = 0;
|
||||
SET idle_in_transaction_session_timeout = 0;
|
||||
SET client_encoding = 'UTF8';
|
||||
SET standard_conforming_strings = on;
|
||||
SELECT pg_catalog.set_config('search_path', '', false);
|
||||
SET check_function_bodies = false;
|
||||
SET xmloption = content;
|
||||
SET client_min_messages = warning;
|
||||
SET row_security = off;
|
||||
|
||||
--
|
||||
-- Name: EvCharging; Type: TYPE; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
CREATE TYPE public."EvCharging" AS ENUM (
|
||||
'NONE',
|
||||
'FREE',
|
||||
'PAID'
|
||||
);
|
||||
|
||||
|
||||
ALTER TYPE public."EvCharging" OWNER TO lomavuokraus;
|
||||
|
||||
--
|
||||
-- Name: ListingStatus; Type: TYPE; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
CREATE TYPE public."ListingStatus" AS ENUM (
|
||||
'DRAFT',
|
||||
'PENDING',
|
||||
'PUBLISHED',
|
||||
'REJECTED',
|
||||
'REMOVED'
|
||||
);
|
||||
|
||||
|
||||
ALTER TYPE public."ListingStatus" OWNER TO lomavuokraus;
|
||||
|
||||
--
|
||||
-- Name: Role; Type: TYPE; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
CREATE TYPE public."Role" AS ENUM (
|
||||
'USER',
|
||||
'ADMIN',
|
||||
'USER_MODERATOR',
|
||||
'LISTING_MODERATOR'
|
||||
);
|
||||
|
||||
|
||||
ALTER TYPE public."Role" OWNER TO lomavuokraus;
|
||||
|
||||
--
|
||||
-- Name: UserStatus; Type: TYPE; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
CREATE TYPE public."UserStatus" AS ENUM (
|
||||
'PENDING',
|
||||
'ACTIVE',
|
||||
'DISABLED',
|
||||
'REJECTED',
|
||||
'REMOVED'
|
||||
);
|
||||
|
||||
|
||||
ALTER TYPE public."UserStatus" OWNER TO lomavuokraus;
|
||||
|
||||
SET default_tablespace = '';
|
||||
|
||||
SET default_table_access_method = heap;
|
||||
|
||||
--
|
||||
-- Name: Listing; Type: TABLE; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
CREATE TABLE public."Listing" (
|
||||
id text NOT NULL,
|
||||
"ownerId" text NOT NULL,
|
||||
country text NOT NULL,
|
||||
region text NOT NULL,
|
||||
city text NOT NULL,
|
||||
"addressNote" text,
|
||||
latitude double precision,
|
||||
longitude double precision,
|
||||
"maxGuests" integer NOT NULL,
|
||||
bedrooms integer NOT NULL,
|
||||
beds integer NOT NULL,
|
||||
bathrooms integer NOT NULL,
|
||||
"hasSauna" boolean DEFAULT false NOT NULL,
|
||||
"hasFireplace" boolean DEFAULT false NOT NULL,
|
||||
"hasWifi" boolean DEFAULT false NOT NULL,
|
||||
"petsAllowed" boolean DEFAULT false NOT NULL,
|
||||
"byTheLake" boolean DEFAULT false NOT NULL,
|
||||
"contactName" text NOT NULL,
|
||||
"contactEmail" text NOT NULL,
|
||||
"contactPhone" text,
|
||||
"externalUrl" text,
|
||||
published boolean DEFAULT true NOT NULL,
|
||||
"createdAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
"updatedAt" timestamp(3) without time zone NOT NULL,
|
||||
"approvedAt" timestamp(3) without time zone,
|
||||
"approvedById" text,
|
||||
status public."ListingStatus" DEFAULT 'PENDING'::public."ListingStatus" NOT NULL,
|
||||
"rejectedAt" timestamp(3) without time zone,
|
||||
"rejectedById" text,
|
||||
"rejectedReason" text,
|
||||
"removedAt" timestamp(3) without time zone,
|
||||
"removedById" text,
|
||||
"removedReason" text,
|
||||
"hasAirConditioning" boolean DEFAULT false NOT NULL,
|
||||
"streetAddress" text,
|
||||
"evCharging" public."EvCharging" DEFAULT 'NONE'::public."EvCharging" NOT NULL,
|
||||
"isSample" boolean DEFAULT false NOT NULL,
|
||||
"hasKitchen" boolean DEFAULT false NOT NULL,
|
||||
"hasDishwasher" boolean DEFAULT false NOT NULL,
|
||||
"hasWashingMachine" boolean DEFAULT false NOT NULL,
|
||||
"hasBarbecue" boolean DEFAULT false NOT NULL,
|
||||
"calendarUrls" text[] DEFAULT ARRAY[]::text[] NOT NULL,
|
||||
"priceWeekdayEuros" integer,
|
||||
"priceWeekendEuros" integer,
|
||||
"hasMicrowave" boolean DEFAULT false NOT NULL,
|
||||
"hasFreeParking" boolean DEFAULT false NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public."Listing" OWNER TO lomavuokraus;
|
||||
|
||||
--
|
||||
-- Name: ListingImage; Type: TABLE; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
CREATE TABLE public."ListingImage" (
|
||||
id text NOT NULL,
|
||||
"listingId" text NOT NULL,
|
||||
url text,
|
||||
"altText" text,
|
||||
"order" integer DEFAULT 0 NOT NULL,
|
||||
"createdAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
"updatedAt" timestamp(3) without time zone NOT NULL,
|
||||
"isCover" boolean DEFAULT false NOT NULL,
|
||||
data bytea,
|
||||
"mimeType" text,
|
||||
size integer
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public."ListingImage" OWNER TO lomavuokraus;
|
||||
|
||||
--
|
||||
-- Name: ListingTranslation; Type: TABLE; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
CREATE TABLE public."ListingTranslation" (
|
||||
id text NOT NULL,
|
||||
"listingId" text NOT NULL,
|
||||
locale text NOT NULL,
|
||||
title text NOT NULL,
|
||||
slug text NOT NULL,
|
||||
description text NOT NULL,
|
||||
teaser text,
|
||||
"createdAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
"updatedAt" timestamp(3) without time zone NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public."ListingTranslation" OWNER TO lomavuokraus;
|
||||
|
||||
--
|
||||
-- Name: User; Type: TABLE; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
CREATE TABLE public."User" (
|
||||
id text NOT NULL,
|
||||
email text NOT NULL,
|
||||
name text,
|
||||
role public."Role" DEFAULT 'USER'::public."Role" NOT NULL,
|
||||
"createdAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
"updatedAt" timestamp(3) without time zone NOT NULL,
|
||||
"approvedAt" timestamp(3) without time zone,
|
||||
"emailVerifiedAt" timestamp(3) without time zone,
|
||||
"passwordHash" text DEFAULT ''::text NOT NULL,
|
||||
status public."UserStatus" DEFAULT 'PENDING'::public."UserStatus" NOT NULL,
|
||||
"rejectedAt" timestamp(3) without time zone,
|
||||
"rejectedReason" text,
|
||||
"removedAt" timestamp(3) without time zone,
|
||||
"removedById" text,
|
||||
"removedReason" text,
|
||||
phone text
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public."User" OWNER TO lomavuokraus;
|
||||
|
||||
--
|
||||
-- Name: VerificationToken; Type: TABLE; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
CREATE TABLE public."VerificationToken" (
|
||||
id text NOT NULL,
|
||||
"userId" text NOT NULL,
|
||||
token text NOT NULL,
|
||||
type text NOT NULL,
|
||||
"expiresAt" timestamp(3) without time zone NOT NULL,
|
||||
"consumedAt" timestamp(3) without time zone,
|
||||
"createdAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public."VerificationToken" OWNER TO lomavuokraus;
|
||||
|
||||
--
|
||||
-- Name: _prisma_migrations; Type: TABLE; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
CREATE TABLE public._prisma_migrations (
|
||||
id character varying(36) NOT NULL,
|
||||
checksum character varying(64) NOT NULL,
|
||||
finished_at timestamp with time zone,
|
||||
migration_name character varying(255) NOT NULL,
|
||||
logs text,
|
||||
rolled_back_at timestamp with time zone,
|
||||
started_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
applied_steps_count integer DEFAULT 0 NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public._prisma_migrations OWNER TO lomavuokraus;
|
||||
|
||||
--
|
||||
-- Name: ListingImage ListingImage_pkey; Type: CONSTRAINT; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public."ListingImage"
|
||||
ADD CONSTRAINT "ListingImage_pkey" PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: ListingTranslation ListingTranslation_pkey; Type: CONSTRAINT; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public."ListingTranslation"
|
||||
ADD CONSTRAINT "ListingTranslation_pkey" PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: Listing Listing_pkey; Type: CONSTRAINT; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public."Listing"
|
||||
ADD CONSTRAINT "Listing_pkey" PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: User User_pkey; Type: CONSTRAINT; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public."User"
|
||||
ADD CONSTRAINT "User_pkey" PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: VerificationToken VerificationToken_pkey; Type: CONSTRAINT; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public."VerificationToken"
|
||||
ADD CONSTRAINT "VerificationToken_pkey" PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: _prisma_migrations _prisma_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public._prisma_migrations
|
||||
ADD CONSTRAINT _prisma_migrations_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: ListingTranslation_listingId_locale_key; Type: INDEX; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
CREATE UNIQUE INDEX "ListingTranslation_listingId_locale_key" ON public."ListingTranslation" USING btree ("listingId", locale);
|
||||
|
||||
|
||||
--
|
||||
-- Name: ListingTranslation_slug_locale_key; Type: INDEX; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
CREATE UNIQUE INDEX "ListingTranslation_slug_locale_key" ON public."ListingTranslation" USING btree (slug, locale);
|
||||
|
||||
|
||||
--
|
||||
-- Name: User_email_key; Type: INDEX; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
CREATE UNIQUE INDEX "User_email_key" ON public."User" USING btree (email);
|
||||
|
||||
|
||||
--
|
||||
-- Name: VerificationToken_token_key; Type: INDEX; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
CREATE UNIQUE INDEX "VerificationToken_token_key" ON public."VerificationToken" USING btree (token);
|
||||
|
||||
|
||||
--
|
||||
-- Name: VerificationToken_userId_idx; Type: INDEX; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
CREATE INDEX "VerificationToken_userId_idx" ON public."VerificationToken" USING btree ("userId");
|
||||
|
||||
|
||||
--
|
||||
-- Name: ListingImage ListingImage_listingId_fkey; Type: FK CONSTRAINT; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public."ListingImage"
|
||||
ADD CONSTRAINT "ListingImage_listingId_fkey" FOREIGN KEY ("listingId") REFERENCES public."Listing"(id) ON UPDATE CASCADE ON DELETE RESTRICT;
|
||||
|
||||
|
||||
--
|
||||
-- Name: ListingTranslation ListingTranslation_listingId_fkey; Type: FK CONSTRAINT; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public."ListingTranslation"
|
||||
ADD CONSTRAINT "ListingTranslation_listingId_fkey" FOREIGN KEY ("listingId") REFERENCES public."Listing"(id) ON UPDATE CASCADE ON DELETE RESTRICT;
|
||||
|
||||
|
||||
--
|
||||
-- Name: Listing Listing_approvedById_fkey; Type: FK CONSTRAINT; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public."Listing"
|
||||
ADD CONSTRAINT "Listing_approvedById_fkey" FOREIGN KEY ("approvedById") REFERENCES public."User"(id) ON UPDATE CASCADE ON DELETE SET NULL;
|
||||
|
||||
|
||||
--
|
||||
-- Name: Listing Listing_ownerId_fkey; Type: FK CONSTRAINT; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public."Listing"
|
||||
ADD CONSTRAINT "Listing_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES public."User"(id) ON UPDATE CASCADE ON DELETE RESTRICT;
|
||||
|
||||
|
||||
--
|
||||
-- Name: VerificationToken VerificationToken_userId_fkey; Type: FK CONSTRAINT; Schema: public; Owner: lomavuokraus
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public."VerificationToken"
|
||||
ADD CONSTRAINT "VerificationToken_userId_fkey" FOREIGN KEY ("userId") REFERENCES public."User"(id) ON UPDATE CASCADE ON DELETE RESTRICT;
|
||||
|
||||
|
||||
--
|
||||
-- PostgreSQL database dump complete
|
||||
--
|
||||
|
||||
\unrestrict V6pdk4hxHk7VQYnrn2NO7clngbg01PyshHFsoDbbbQ28wtOAfkiTfl6BQQ0BtLG
|
||||
|
||||
|
|
@ -113,7 +113,7 @@ flowchart TB
|
|||
<h2>Runtime Environment</h2>
|
||||
<ul>
|
||||
<li>Next.js 14.2.33 (App Router) running via Node.js 20 in Docker.</li>
|
||||
<li>PostgreSQL DB at <code>46.62.203.202</code> (DATABASE_URL in .env, not committed).</li>
|
||||
<li>PostgreSQL at <code>46.62.203.202</code>; staging/prod DB <code>lomavuokraus</code> is clean with only the seeded admin, testing DB <code>lomavuokraus_testing</code> holds the previous data. Schema snapshot tracked in <code>docs/db-schema.sql</code>.</li>
|
||||
<li>SMTP: smtp.lomavuokraus.fi (CNAME to smtp.sohva.org), DKIM key under <code>creds/dkim/...</code>.</li>
|
||||
<li>Session auth: signed JWT cookie <code>session_token</code>; roles: USER, ADMIN, USER_MODERATOR, LISTING_MODERATOR.</li>
|
||||
</ul>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue