fix:supabase+tags+changed data models+seeded data

This commit is contained in:
Damien Ostler 2024-05-27 11:17:56 -04:00
parent 82efd1f10e
commit a48488a128
13 changed files with 187 additions and 178 deletions

View File

@ -1,3 +1,2 @@
NEXT_PUBLIC_SUPABASE_URL=http://127.0.0.1:54323 NEXT_PUBLIC_SUPABASE_URL=http://localhost:54321
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE
NEXT_PUBLIC_

2
.env
View File

@ -1,2 +1,2 @@
NEXT_PUBLIC_SUPABASE_URL=http://127.0.0.1:54323 NEXT_PUBLIC_SUPABASE_URL=http://127.0.0.1:54321
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0 NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0

View File

@ -5,6 +5,6 @@
"deno.lint": true, "deno.lint": true,
"deno.unstable": true, "deno.unstable": true,
"[typescript]": { "[typescript]": {
"editor.defaultFormatter": "denoland.vscode-deno" "editor.defaultFormatter": "vscode.typescript-language-features"
} }
} }

View File

@ -7,7 +7,6 @@
- https://nextjs.org/docs - https://nextjs.org/docs
- https://supabase.com/docs/ - https://supabase.com/docs/
- https://owncast.online/docs/ - https://owncast.online/docs/
- https://docs.npmjs.com/downloading-and-installing-node-js-and-npm
- https://docs.docker.com/engine/install/ - https://docs.docker.com/engine/install/
# Running Backend # Running Backend
@ -17,34 +16,30 @@ You will need docker installed.
You will need supabase CLI. You will need supabase CLI.
- https://docs.docker.com/engine/install/ - https://docs.docker.com/engine/install/
You need npm and nodejs installed. See documentation at start of document.
- https://docs.npmjs.com/downloading-and-installing-node-js-and-npm
1) Open your terminal and navigate to the root of the git repository. 1) Open your terminal and navigate to the root of the git repository.
2) Make sure that docker and docker compose are installed. 2) Make sure that docker and docker compose are installed.
3) Run `docker-compose --env-file ./docker.env up` which will start up OwnCast. 3) Run `docker-compose --env-file ./docker.env up` which will start up OwnCast.
4) Run `supabase start` 4) Run `supabase start`
5) Open your terminal and navigate to the root folder of the git repository.
6) Run the command `npm update`.
7) Once the depedencies are pulled and installed you can run the command `npm run dev` to run the application in development mode.
8) Open http://localhost:3000/
### Updating the database ### Updating the database
Run `supabase db reset`. This will wipe data. Run `supabase db reset`. This will wipe data.
https://supabase.com/docs/guides/cli/local-development?queryGroups=access-method&access-method=kong#database-migrations https://supabase.com/docs/guides/cli/local-development?queryGroups=access-method&access-method=kong#database-migrations
## inbucket ## inbucket
http://localhost:54324/monitor http://localhost:54324su/monitor
This is where all mail being sent shows up from the application for developers. This is where all mail being sent shows up from the application for developers.
## OwnCast ## OwnCast
http://localhost:8080/ http://localhost:8080/
Configuration is done through the Owncast administration page located on your server under /admin. The login username is admin and the password is your stream key, the default being abc123. Configuration is done through the Owncast administration page located on your server under /admin. The login username is admin and the password is your stream key, the default being abc123.
# Running UI
You need npm and nodejs installed. See documentation at start of document.
1) Open your terminal and navigate to the root folder of the git repository.
2) Run the command `npm update`.
3) Once the depedencies are pulled and installed you can run the command `npm run dev` to run the application in development mode.
4) Open http://localhost:3000/
# React Components # React Components
@ -89,5 +84,5 @@ The `GalleryThumbnail` component is a React component used to display a thumbnai
### Usage ### Usage
This will render a thumbnail for the gallery with the ID of "1". When the thumbnail is clicked, it will log the gallery ID to the console. This will render a thumbnail for the gallery with the ID of "1". When the thumbnail is clicked, it will log the gallery ID to the console.
```tsx ```tsx
<GalleryThumbnail id="1" onSelect={(id) => console.log(id)} /> <GalleryThumbnail id="1" onSelect={(id) => //console.log(id)} />
``` ```

View File

@ -8,11 +8,16 @@ export async function GET(
const galleryId = params.id; const galleryId = params.id;
const supabase = createClient(); const supabase = createClient();
const { data: gallery, error: galleryError } = await supabase
.from('galleries')
.select('*')
.eq('name', galleryId)
.single();
// List all files in the galleryId path // List all files in the galleryId path
let { data: files, error } = await supabase.storage.from('galleries').list(galleryId); let { data: files, error } = await supabase.storage.from('galleries').list(gallery.name);
if (files==null || error) { if (files==null || error) {
console.error('Error listing files:', error); //console.error('Error listing files:', error);
return NextResponse.error(); return NextResponse.error();
} }

View File

@ -17,22 +17,22 @@ export async function GET(
request: Request, request: Request,
{ params }: { params: { id: string } } { params }: { params: { id: string } }
) { ) {
const galleryId = params.id;
const supabase = createClient(); const galleryId = params.id.toLowerCase().replace(/\s+/g, '_'); const supabase = createClient();
const user = await supabase.auth.getUser(); const user = await supabase.auth.getUser();
const { data: gallery, error: galleryError } = await supabase const { data: gallery, error: galleryError } = await supabase
.from('galleries') .from('galleries')
.select('*') .select('*')
.eq('id', galleryId) .eq('name', params.id)
.single(); .single();
// List all files in the galleryId path // List all files in the params.id path
let { data: files, error } = await supabase.storage.from('galleries').list(galleryId); let { data: files, error } = await supabase.storage.from('galleries').list(galleryId);
if (files==null || error) { if (files==null || error) {
console.error('Error listing files:', error); //console.error('Error listing files:', error);
return NextResponse.error(); return NextResponse.error();
} }
@ -43,7 +43,7 @@ export async function GET(
let { data: blobdata, error } = await supabase.storage.from('galleries').download(galleryId+"/"+file.name); let { data: blobdata, error } = await supabase.storage.from('galleries').download(galleryId+"/"+file.name);
if (error || blobdata==null) { if (error || blobdata==null) {
console.error('Error downloading file:', error); //console.error('Error downloading file:', error);
continue; continue;
} }
let blobBuffer = Buffer.from(await blobdata.arrayBuffer()); let blobBuffer = Buffer.from(await blobdata.arrayBuffer());

View File

@ -1,6 +1,5 @@
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
import { createClient } from "@/utils/supabase/server"; import { createClient } from "@/utils/supabase/server";
import sharp from 'sharp'; import sharp from 'sharp';
@ -13,63 +12,66 @@ async function blurImage(blob: Buffer): Promise<Buffer> {
return blurredImage; return blurredImage;
} }
export async function GET( export async function GET(
request: Request, request: Request,
{ params }: { params: { id: string } } { params }: { params: { id: string } }
) { ) {
const galleryId= params.id // 312 const galleryId = params.id.toLowerCase().replace(/\s+/g, '_');
const supabase = createClient(); const supabase = createClient();
const user = await supabase.auth.getUser(); const user = await supabase.auth.getUser();
const { data: gallery, error: galleryError } = await supabase const { data: gallery, error: galleryError } = await supabase
.from('galleries') .from('galleries')
.select('*') .select('*')
.eq('id', galleryId) .eq('name', params.id)
.single(); .single();
let userId = user.data.user?.id;
let { data: subscription, error: rolesError } = await supabase let { data: files, error } = await supabase.storage.from('galleries').list(galleryId);
if (files == null || files?.length == 0) {
return NextResponse.error();
}
// Loop through each file, download it, convert it to base64, and add the data URL to the array
let { data: blobdata, error: fileError } = await supabase.storage.from('galleries').download(galleryId + "/" + files[0].name);
if (fileError || blobdata == null) {
//console.error('Error downloading file:', error);
return NextResponse.error();
}
let blobBuffer = Buffer.from(await blobdata.arrayBuffer());
let userId = user.data.user?.id;
let { data: subscription, error: rolesError } = await supabase
.from('user_subscriptions') .from('user_subscriptions')
.select('*') .select('*')
.eq('user_id', userId) .eq('user_id', userId)
.single(); .single();
switch (gallery.tier) {
// Extract galleryId from the route value case "Tier 3":
var blob = null; if (subscription?.subscription != "Tier 3") {
var contentType = "image/jpeg" blobBuffer = await blurImage(blobBuffer);
let { data: blobdata, error } = await supabase.storage.from('galleries').download(galleryId+'/1.jpeg') }
blob = blobdata; break;
if (error) { case "Tier 2":
contentType = "image/png" if (subscription?.subscription != "Tier 3" && subscription?.subscription != "Tier 2") {
let { data: blobdata, error } = await supabase.storage.from('galleries').download(galleryId+'/1.png') blobBuffer = await blurImage(blobBuffer);
console.log(error) }
blob = blobdata; break;
case "Tier 1":
if (subscription?.subscription != "Tier 3" && subscription?.subscription != "Tier 2" && subscription?.subscription != "Tier 1") {
blobBuffer = await blurImage(blobBuffer);
}
break;
default:
break;
} }
if(blob != null){ const contentType = files[0].name.endsWith('.png') ? 'image/png' : 'image/jpeg';
let blobBuffer = Buffer.from(await blob.arrayBuffer()); const dataUrl = `data:${contentType};base64,${blobBuffer.toString('base64')}`;
switch(gallery.tier){
case "Tier 3":
if(subscription?.subscription!="Tier 3"){
blobBuffer = await blurImage(blobBuffer);
}
break;
case "Tier 2":
if(subscription?.subscription!="Tier 3" && subscription?.subscription!="Tier 2"){
blobBuffer = await blurImage(blobBuffer);
}
break;
case "Tier 1":
if(subscription?.subscription!="Tier 3" && subscription?.subscription!="Tier 2" && subscription?.subscription!="Tier 1"){
blobBuffer = await blurImage(blobBuffer);
}
break;
default:
if(gallery.nsfw){
blobBuffer = await blurImage(blobBuffer);
}
break; // Return a JSON response with the array of URLs
} return new Response(dataUrl);
const dataUrl = `data:${contentType};base64,${blobBuffer.toString('base64')}`;
return new Response(dataUrl);
}
return NextResponse.error();
} }

View File

@ -7,34 +7,32 @@ export async function POST(request: Request) {
const url = new URL(request.url); const url = new URL(request.url);
const search = url.searchParams.get("search"); const search = url.searchParams.get("search");
const data = await request.json(); const data = await request.json();
const tags = data.tags; const tags = data.tags as string[];
if(tags.length === 0){ if(tags.length === 0){
let { data: galleries, error } = await supabase let { data: galleries, error } = await supabase
.from('galleries') .from('galleries')
.select('*') .select('*')
.ilike('name', `%${search}%`) .ilike('name', `%${search}%`)
.ilike('description', `%${search}%`); //console.log(error)
return NextResponse.json(galleries); return NextResponse.json(galleries);
} }
else{ else{
// Rest of the code... // Rest of the code...
console.log(tags)
let { data: galleries, error } = await supabase let { data: galleries, error } = await supabase
.from('galleries') .from('galleries')
.select('*') .select('*')
.contains('tags', tags) .contains('tags', tags) // Fix: Use contains instead of overlaps
.ilike('name', `%${search}%`) .ilike('name', `%${search}%`)
.ilike('description', `%${search}%`) //console.log(error)
.order('created_at', { ascending: false });
return NextResponse.json(galleries); return NextResponse.json(galleries);
return NextResponse.json(galleries);
} }
} }
// const tagsResponse = await fetch(`/api/galleries/tags?search=${search}`); // const tagsResponse = await fetch(`/api/galleries/tags?search=${search}`);
// const tagsData = await tagsResponse.json(); // const tagsData = await tagsResponse.json();
// const galleriesWithTagData = galleriesData.map((gallery: any) => { // const galleriesWithTagData = galleriesData.map((gallery: any) => {
// const tags = tagsData.filter((tag: any) => gallery.tags.includes(tag.id)); // const tags = tagsData.filter((tag: any) => gallery.tags.includes(tag.name));
// return { ...gallery, tags }; // return { ...gallery, tags };
// }); // });

View File

@ -54,7 +54,7 @@ function PageComponent() {
}, },
body: JSON.stringify({ tags:selectedTags }) body: JSON.stringify({ tags:selectedTags })
}); });
console.log(galleriesResponse) //console.log(galleriesResponse)
const galleriesData = await galleriesResponse.json(); const galleriesData = await galleriesResponse.json();
const tagsResponse = await fetch(`/api/galleries/tags`); const tagsResponse = await fetch(`/api/galleries/tags`);
const tagsData = await tagsResponse.json(); const tagsData = await tagsResponse.json();
@ -74,95 +74,92 @@ function PageComponent() {
} else { } else {
setSelectedTags([...selectedTags, tag]); setSelectedTags([...selectedTags, tag]);
} }
console.log(selectedTags) //console.log(selectedTags)
}; };
return ( return (
user ? (
<div className="w-full h-full flex justify-center ">
<div className="flex-1 w-full h-full flex flex-col gap-20">
<>
<div className="absolute pl-8 w-2/4 left-1/2 h-full overflow-hidden z-20 animate-in animate-duration-3000 animate-ease-out">
<section className="neroshi-blue-900 h-50 p-8 pt-20 opacity-30 hover:opacity-100">
<div className="container mx-auto py-8">
<input
className="w-full text-neroshi-blue-950 h-16 px-3 rounded mb-8 focus:outline-none focus:shadow-outline text-xl px-8 shadow-lg"
type="search"
placeholder="Search..."
onChange={(e) => setSearch(e.target.value)}
/>
<nav className="grid grid-cols-4 gap-4">
{tags.map((tag, index) => (
<a
key={index}
className={`rounded-lg no-underline text-white py-3 px-4 font-medium text-center ${
selectedTags.includes(tag.id) ? 'bg-neroshi-blue-950 hover:bg-neroshi-blue-900' : 'bg-neroshi-blue-800 hover:bg-neroshi-blue-700'
}`}
href="#"
onClick={() => handleTagClick(tag.id)}
>
{tag.name}
</a>
))}
</nav>
</div>
</section>
</div>
<div className="absolute w-full h-full overflow-hidden z-0 animate-fade-left animate-fade-left animate-once animate-duration-[2000ms] animate-normal animate-fill-forwards"> <div className="w-full h-full flex justify-center ">
<img <div className="flex-1 w-full h-full flex flex-col gap-20">
src="gallery_girl.png" <>
className="float-right object-cover h-screen w-3/6 opacity-50 overflow-hidden" <div className="absolute pl-8 w-2/4 left-1/2 h-full overflow-hidden z-20 animate-in animate-duration-3000 animate-ease-out">
alt="Background" <section className="neroshi-blue-900 h-50 p-8 pt-20 opacity-30 hover:opacity-100">
<div className="container mx-auto py-8">
<input
className="w-full text-neroshi-blue-950 h-16 px-3 rounded mb-8 focus:outline-none focus:shadow-outline text-xl px-8 shadow-lg"
type="search"
placeholder="Search..."
onChange={(e) => setSearch(e.target.value)}
/> />
</div> <nav className="grid grid-cols-4 gap-4">
{tags.map((tag, index) => (
<div className="absolute items-center w-2/4 h-full ml-10 z-0 overflow-hidden animate-in animate-ease-out"> <a
<div className="grid grid-cols-3 gap-y-52 gap-x-5 h-full overflow-y-auto no-scrollbar pt-20"> key={index}
{galleries && galleries.map((gallery, index) => ( className={`rounded-lg no-underline text-white py-3 px-4 font-medium text-center ${
<GalleryThumbnail selectedTags.includes(tag.name) ? 'bg-neroshi-blue-950 hover:bg-neroshi-blue-900' : 'bg-neroshi-blue-800 hover:bg-neroshi-blue-700'
key={gallery.id} }`}
id={gallery.id} href="#"
title={gallery.name} onClick={() => handleTagClick(tag.name)}
tags = {gallery.tags} >
columns={gallery.columns} {tag.name}
subscription={gallery.tier as string} </a>
onSelect={selectGallery}
nsfw={gallery.nsfw}
></GalleryThumbnail>
))} ))}
<div className="pt-10"></div> </nav>
<div className="pt-10"></div>
</div>
</div> </div>
</> </section>
</div> </div>
{isOpen ? (
<> <div className="absolute w-full h-full overflow-hidden z-0 animate-fade-left animate-fade-left animate-once animate-duration-[2000ms] animate-normal animate-fill-forwards">
<div <img
className={`fixed inset-0 transition-opacity z-30 ${ src="gallery_girl.png"
isOpen ? "animate-in" : "fade-out" className="float-right object-cover h-screen w-3/6 opacity-50 overflow-hidden"
}`} alt="Background"
aria-hidden="true" />
> </div>
<div
className="absolute inset-0 bg-neroshi-blue-900 opacity-70 z-30" <div className="absolute items-center w-2/4 h-full ml-10 z-0 overflow-hidden animate-in animate-ease-out">
onClick={() => setIsOpen(false)} <div className="grid grid-cols-3 gap-y-52 gap-x-5 h-full overflow-y-auto no-scrollbar pt-20">
></div> {galleries && galleries.map((gallery, index) => (
<div className="absolute inset-0 overflow-y-auto overflow-x-hidden no-scrollbar pt-2 w-full p-20 z-30"> <GalleryThumbnail
<Gallery key={gallery.id}
id={selectedGallery as string} id={gallery.name}
columns={galleryColumns} title={gallery.name}
closeMenu={() => closeGallery()} tags = {gallery.tags}
></Gallery> columns={gallery.columns}
</div> subscription={gallery.tier as string}
</div> onSelect={selectGallery}
</> nsfw={gallery.nsfw}
) : null} ></GalleryThumbnail>
</div> ))}
) : ( <div className="pt-10"></div>
<h1>loading</h1> <div className="pt-10"></div>
) </div>
</div>
</>
</div>
{isOpen ? (
<>
<div
className={`fixed inset-0 transition-opacity z-30 ${
isOpen ? "animate-in" : "fade-out"
}`}
aria-hidden="true"
>
<div
className="absolute inset-0 bg-neroshi-blue-900 opacity-70 z-30"
onClick={() => setIsOpen(false)}
></div>
<div className="absolute inset-0 overflow-y-auto overflow-x-hidden no-scrollbar pt-2 w-full p-20 z-30">
<Gallery
id={selectedGallery as string}
columns={galleryColumns}
closeMenu={() => closeGallery()}
></Gallery>
</div>
</div>
</>
) : null}
</div>
); );
} }

View File

@ -30,8 +30,8 @@ export default async function Login({
password, password,
}); });
//console.log(error);
if (error) { if (error) {
console.log(data);
return redirect("/login?message=Could not authenticate user"); return redirect("/login?message=Could not authenticate user");
} }
@ -54,6 +54,7 @@ export default async function Login({
}, },
}); });
//console.log(error);
if (error) { if (error) {
return redirect("/login?message=Could not authenticate user"); return redirect("/login?message=Could not authenticate user");
} }

View File

@ -130,7 +130,7 @@ const Gallery = ({ id, columns, closeMenu }: GalleryProps) => {
const open = () => { const open = () => {
if (selectedImage === null) return; if (selectedImage === null) return;
console.log(selectedImage) //console.log(selectedImage)
let base64Image = selectedImage.split(';base64,').pop(); let base64Image = selectedImage.split(';base64,').pop();
if (!base64Image) return; if (!base64Image) return;
let blob = new Blob([Uint8Array.from(atob(base64Image), c => c.charCodeAt(0))], { type: 'image/jpeg' }); // adjust the type as needed let blob = new Blob([Uint8Array.from(atob(base64Image), c => c.charCodeAt(0))], { type: 'image/jpeg' }); // adjust the type as needed

View File

@ -25,9 +25,9 @@ const GalleryThumbnail = ({ id, columns, onSelect, title,nsfw, subscription, tag
const getData = async () => { const getData = async () => {
setIsLoading(true); setIsLoading(true);
const thumbnailResponse = await fetch('/api/galleries/' + galleryId + '/thumbnail'); const thumbnailResponse = await fetch('/api/galleries/' + title + '/thumbnail');
const thumbnailUrl = await thumbnailResponse.text(); const thumbnailUrl = await thumbnailResponse.text();
const imagesCountResponse = await fetch('/api/galleries/' + galleryId + '/images/count'); const imagesCountResponse = await fetch('/api/galleries/' + title + '/images/count');
const imageCount = await imagesCountResponse.json() as number; const imageCount = await imagesCountResponse.json() as number;
setImageCount(imageCount); setImageCount(imageCount);
setThumbnailUrl(thumbnailUrl); setThumbnailUrl(thumbnailUrl);

View File

@ -22,6 +22,11 @@ SET row_security = off;
-- Data for Name: audit_log_entries; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin -- Data for Name: audit_log_entries; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
-- --
INSERT INTO "auth"."audit_log_entries" ("instance_id", "id", "payload", "created_at", "ip_address") VALUES
('00000000-0000-0000-0000-000000000000', 'd337a17f-a756-46eb-a0e8-8ef80fd0510d', '{"action":"user_signedup","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"team","traits":{"provider":"email"}}', '2024-05-27 14:10:29.638476+00', ''),
('00000000-0000-0000-0000-000000000000', 'd3e71df0-114a-4490-aeeb-6f92c45bad74', '{"action":"login","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"account","traits":{"provider":"email"}}', '2024-05-27 14:10:29.64088+00', ''),
('00000000-0000-0000-0000-000000000000', '1eab1cf3-5656-42c2-9e0b-796222de0c55', '{"action":"logout","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"account"}', '2024-05-27 14:15:04.733941+00', ''),
('00000000-0000-0000-0000-000000000000', '410c5c63-cba5-442a-a6bb-157acc0bd370', '{"action":"login","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"account","traits":{"provider":"email"}}', '2024-05-27 14:34:43.53365+00', '');
-- --
@ -34,12 +39,16 @@ SET row_security = off;
-- Data for Name: users; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin -- Data for Name: users; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
-- --
INSERT INTO "auth"."users" ("instance_id", "id", "aud", "role", "email", "encrypted_password", "email_confirmed_at", "invited_at", "confirmation_token", "confirmation_sent_at", "recovery_token", "recovery_sent_at", "email_change_token_new", "email_change", "email_change_sent_at", "last_sign_in_at", "raw_app_meta_data", "raw_user_meta_data", "is_super_admin", "created_at", "updated_at", "phone", "phone_confirmed_at", "phone_change", "phone_change_token", "phone_change_sent_at", "email_change_token_current", "email_change_confirm_status", "banned_until", "reauthentication_token", "reauthentication_sent_at", "is_sso_user", "deleted_at", "is_anonymous") VALUES
('00000000-0000-0000-0000-000000000000', '893c7701-d5df-4415-80bd-1ec089764400', 'authenticated', 'authenticated', 'damienostler1@outlook.com', '$2a$10$ISYdoWsKL7gxfRz7c5IKDOTsmcjNpGgg9OOApYLMOvtOoNTo4HGM6', '2024-05-27 14:10:29.639017+00', NULL, '', NULL, '', NULL, '', '', NULL, '2024-05-27 14:34:43.534227+00', '{"provider": "email", "providers": ["email"]}', '{"sub": "893c7701-d5df-4415-80bd-1ec089764400", "email": "damienostler1@outlook.com", "email_verified": false, "phone_verified": false}', NULL, '2024-05-27 14:10:29.634157+00', '2024-05-27 14:34:43.535377+00', NULL, NULL, '', '', NULL, '', 0, NULL, '', NULL, false, NULL, false);
-- --
-- Data for Name: identities; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin -- Data for Name: identities; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
-- --
INSERT INTO "auth"."identities" ("provider_id", "user_id", "identity_data", "provider", "last_sign_in_at", "created_at", "updated_at", "id") VALUES
('893c7701-d5df-4415-80bd-1ec089764400', '893c7701-d5df-4415-80bd-1ec089764400', '{"sub": "893c7701-d5df-4415-80bd-1ec089764400", "email": "damienostler1@outlook.com", "email_verified": false, "phone_verified": false}', 'email', '2024-05-27 14:10:29.636992+00', '2024-05-27 14:10:29.637013+00', '2024-05-27 14:10:29.637013+00', 'b823bde7-9eae-4e1f-8253-75f12f0f06f2');
-- --
@ -52,12 +61,16 @@ SET row_security = off;
-- Data for Name: sessions; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin -- Data for Name: sessions; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
-- --
INSERT INTO "auth"."sessions" ("id", "user_id", "created_at", "updated_at", "factor_id", "aal", "not_after", "refreshed_at", "user_agent", "ip", "tag") VALUES
('3499fcf0-59da-493f-ae3b-617ef41b4404', '893c7701-d5df-4415-80bd-1ec089764400', '2024-05-27 14:34:43.534268+00', '2024-05-27 14:34:43.534268+00', NULL, 'aal1', NULL, NULL, 'node', '192.168.65.1', NULL);
-- --
-- Data for Name: mfa_amr_claims; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin -- Data for Name: mfa_amr_claims; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
-- --
INSERT INTO "auth"."mfa_amr_claims" ("session_id", "created_at", "updated_at", "authentication_method", "id") VALUES
('3499fcf0-59da-493f-ae3b-617ef41b4404', '2024-05-27 14:34:43.535548+00', '2024-05-27 14:34:43.535548+00', 'password', 'dcc35216-f906-4501-812d-f2ed2704ab8e');
-- --
@ -76,6 +89,8 @@ SET row_security = off;
-- Data for Name: refresh_tokens; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin -- Data for Name: refresh_tokens; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
-- --
INSERT INTO "auth"."refresh_tokens" ("instance_id", "id", "token", "user_id", "revoked", "created_at", "updated_at", "parent", "session_id") VALUES
('00000000-0000-0000-0000-000000000000', 2, 'HsInil2IT99mHjGqk_xeKA', '893c7701-d5df-4415-80bd-1ec089764400', false, '2024-05-27 14:34:43.534857+00', '2024-05-27 14:34:43.534857+00', NULL, '3499fcf0-59da-493f-ae3b-617ef41b4404');
-- --
@ -112,6 +127,8 @@ SET row_security = off;
-- Data for Name: galleries; Type: TABLE DATA; Schema: public; Owner: postgres -- Data for Name: galleries; Type: TABLE DATA; Schema: public; Owner: postgres
-- --
INSERT INTO "public"."galleries" ("name", "column_number", "tier", "tags") VALUES
('Test Gallery', 3, 'Free', '{"Test Tag"}');
-- --
@ -139,13 +156,8 @@ INSERT INTO "storage"."buckets" ("id", "name", "owner", "created_at", "updated_a
-- --
INSERT INTO "storage"."objects" ("id", "bucket_id", "name", "owner", "created_at", "updated_at", "last_accessed_at", "metadata", "version", "owner_id") VALUES INSERT INTO "storage"."objects" ("id", "bucket_id", "name", "owner", "created_at", "updated_at", "last_accessed_at", "metadata", "version", "owner_id") VALUES
('25ea2051-ae55-4728-90ac-aea08467166c', 'galleries', 'Test Gallery/neroshi-1-3.png', NULL, '2024-05-27 13:15:29.27921+00', '2024-05-27 13:15:29.27921+00', '2024-05-27 13:15:29.27921+00', '{"eTag": "\"2c6f2901ed88fbdd8c790a4b77d9caa8\"", "size": 156786, "mimetype": "image/png", "cacheControl": "max-age=3600", "lastModified": "2024-05-27T13:15:29.267Z", "contentLength": 156786, "httpStatusCode": 200}', '62b23c8b-251a-4410-89b1-c54ba4e26526', NULL), ('25ea2051-ae55-4728-90ac-aea08467166c', 'galleries', 'test_gallery/neroshi-1-3.png', NULL, '2024-05-27 13:15:29.27921+00', '2024-05-27 14:51:41.449764+00', '2024-05-27 13:15:29.27921+00', '{"eTag": "\"2c6f2901ed88fbdd8c790a4b77d9caa8\"", "size": 156786, "mimetype": "image/png", "cacheControl": "max-age=3600", "lastModified": "2024-05-27T14:51:41.442Z", "contentLength": 156786, "httpStatusCode": 200}', 'c9d36afc-0afe-49e3-87c9-7c1bf5b2824a', NULL),
('876c4095-98fe-480b-b7f4-9bbe8cb0e9f1', 'galleries', 'Test Gallery/neroshi-3.jpeg', NULL, '2024-05-27 13:15:29.279371+00', '2024-05-27 13:15:29.279371+00', '2024-05-27 13:15:29.279371+00', '{"eTag": "\"7fd95d9da9f3e6c7237a94feedcfc3af\"", "size": 97841, "mimetype": "image/jpeg", "cacheControl": "max-age=3600", "lastModified": "2024-05-27T13:15:29.269Z", "contentLength": 97841, "httpStatusCode": 200}', 'c69a89e2-5cd8-462e-9716-b46bc6992012', NULL), ('54527fef-4a47-48ed-b7aa-4dc10eb2a421', 'galleries', 'test_gallery/neroshi-1-2.jpeg', NULL, '2024-05-27 13:15:29.284061+00', '2024-05-27 14:51:41.458674+00', '2024-05-27 13:15:29.284061+00', '{"eTag": "\"a22ea7bfaed689b675b11428b98de42e\"", "size": 705547, "mimetype": "image/jpeg", "cacheControl": "max-age=3600", "lastModified": "2024-05-27T14:51:41.442Z", "contentLength": 705547, "httpStatusCode": 200}', '3ea9ec28-b51b-45fd-a273-00d20b9b96f1', NULL);
('54527fef-4a47-48ed-b7aa-4dc10eb2a421', 'galleries', 'Test Gallery/neroshi-1-2.jpeg', NULL, '2024-05-27 13:15:29.284061+00', '2024-05-27 13:15:29.284061+00', '2024-05-27 13:15:29.284061+00', '{"eTag": "\"a22ea7bfaed689b675b11428b98de42e\"", "size": 705547, "mimetype": "image/jpeg", "cacheControl": "max-age=3600", "lastModified": "2024-05-27T13:15:29.259Z", "contentLength": 705547, "httpStatusCode": 200}', '68f50e59-915a-470a-8c70-ffa24bceeae5', NULL),
('ab6b077b-96c9-47d5-8b6e-26603a7f5526', 'galleries', 'Test Gallery/neroshi-2.jpeg', NULL, '2024-05-27 13:15:29.284648+00', '2024-05-27 13:15:29.284648+00', '2024-05-27 13:15:29.284648+00', '{"eTag": "\"f8eaf2e06e34ad1b3e101908ab02883e\"", "size": 326461, "mimetype": "image/jpeg", "cacheControl": "max-age=3600", "lastModified": "2024-05-27T13:15:29.272Z", "contentLength": 326461, "httpStatusCode": 200}', 'c53ebb38-77a3-4dba-b5ff-f6b7942938fe', NULL),
('9f340e7e-ebfe-49e3-b939-ce6a76b00524', 'galleries', 'Test Gallery/neroshi-1.jpeg', NULL, '2024-05-27 13:15:29.29804+00', '2024-05-27 13:15:29.29804+00', '2024-05-27 13:15:29.29804+00', '{"eTag": "\"76b9705bb529b16fc58a4bdb0b134c9b\"", "size": 552385, "mimetype": "image/jpeg", "cacheControl": "max-age=3600", "lastModified": "2024-05-27T13:15:29.273Z", "contentLength": 552385, "httpStatusCode": 200}', 'fd99b1e9-ba96-44fe-943a-1aa23a98db0d', NULL),
('daa4f8bb-5227-48a8-ae9c-9c9bc0cb61fe', 'galleries', 'Test Gallery/neroshi-4-1.jpeg', NULL, '2024-05-27 13:15:29.305156+00', '2024-05-27 13:15:29.305156+00', '2024-05-27 13:15:29.305156+00', '{"eTag": "\"eac1dd9a94c71dd30f565f95d32b0c6b\"", "size": 1227804, "mimetype": "image/jpeg", "cacheControl": "max-age=3600", "lastModified": "2024-05-27T13:15:29.273Z", "contentLength": 1227804, "httpStatusCode": 200}', 'ffb64256-a72e-453a-8336-56fa12cc901f', NULL),
('21df51f4-efc9-4076-bc84-9699b6efea72', 'galleries', 'Test Gallery/neroshi-4-2.jpeg', NULL, '2024-05-27 13:15:29.308884+00', '2024-05-27 13:15:29.308884+00', '2024-05-27 13:15:29.308884+00', '{"eTag": "\"d06af35773c09ff8cc1f4a590052be28\"", "size": 456918, "mimetype": "image/jpeg", "cacheControl": "max-age=3600", "lastModified": "2024-05-27T13:15:29.301Z", "contentLength": 456918, "httpStatusCode": 200}', 'aaa5abda-7fb7-46e0-b3ec-a57679276386', NULL);
-- --
@ -176,7 +188,7 @@ INSERT INTO "storage"."objects" ("id", "bucket_id", "name", "owner", "created_at
-- Name: refresh_tokens_id_seq; Type: SEQUENCE SET; Schema: auth; Owner: supabase_auth_admin -- Name: refresh_tokens_id_seq; Type: SEQUENCE SET; Schema: auth; Owner: supabase_auth_admin
-- --
SELECT pg_catalog.setval('"auth"."refresh_tokens_id_seq"', 1, false); SELECT pg_catalog.setval('"auth"."refresh_tokens_id_seq"', 2, true);
-- --