Skip to content

Commit 3163e6e

Browse files
committed
Creating GUI for Admin role
1 parent 3659d82 commit 3163e6e

5 files changed

Lines changed: 268 additions & 0 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# This file is intentionally left blank.
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
-- CreateEnum
2+
CREATE TYPE "Role" AS ENUM ('ADMIN', 'ANALYST');
3+
4+
-- CreateEnum
5+
CREATE TYPE "DashboardStatus" AS ENUM ('ACTIVE', 'INACTIVE', 'ERROR');
6+
7+
-- CreateTable
8+
CREATE TABLE "Organization" (
9+
"id" TEXT NOT NULL,
10+
"name" TEXT NOT NULL,
11+
"slug" TEXT NOT NULL,
12+
"allowedEmailDomains" TEXT[],
13+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
14+
"updatedAt" TIMESTAMP(3) NOT NULL,
15+
16+
CONSTRAINT "Organization_pkey" PRIMARY KEY ("id")
17+
);
18+
19+
-- CreateTable
20+
CREATE TABLE "User" (
21+
"id" TEXT NOT NULL,
22+
"name" TEXT NOT NULL,
23+
"email" TEXT NOT NULL,
24+
"passwordHash" TEXT NOT NULL,
25+
"role" "Role" NOT NULL,
26+
"organizationId" TEXT NOT NULL,
27+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
28+
"updatedAt" TIMESTAMP(3) NOT NULL,
29+
30+
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
31+
);
32+
33+
-- CreateTable
34+
CREATE TABLE "Dashboard" (
35+
"id" TEXT NOT NULL,
36+
"name" TEXT NOT NULL,
37+
"externalId" TEXT NOT NULL,
38+
"status" "DashboardStatus" NOT NULL,
39+
"iframeUrl" TEXT,
40+
"data" JSONB,
41+
"lastSyncAt" TIMESTAMP(3),
42+
"organizationId" TEXT NOT NULL,
43+
"userId" TEXT,
44+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
45+
"updatedAt" TIMESTAMP(3) NOT NULL,
46+
47+
CONSTRAINT "Dashboard_pkey" PRIMARY KEY ("id")
48+
);
49+
50+
-- CreateTable
51+
CREATE TABLE "Report" (
52+
"id" TEXT NOT NULL,
53+
"title" TEXT NOT NULL,
54+
"description" TEXT,
55+
"data" JSONB,
56+
"organizationId" TEXT NOT NULL,
57+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
58+
59+
CONSTRAINT "Report_pkey" PRIMARY KEY ("id")
60+
);
61+
62+
-- CreateTable
63+
CREATE TABLE "AuditLog" (
64+
"id" TEXT NOT NULL,
65+
"actorUserId" TEXT NOT NULL,
66+
"action" TEXT NOT NULL,
67+
"targetType" TEXT NOT NULL,
68+
"targetId" TEXT,
69+
"organizationId" TEXT NOT NULL,
70+
"metadata" JSONB,
71+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
72+
73+
CONSTRAINT "AuditLog_pkey" PRIMARY KEY ("id")
74+
);
75+
76+
-- CreateIndex
77+
CREATE UNIQUE INDEX "Organization_slug_key" ON "Organization"("slug");
78+
79+
-- CreateIndex
80+
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
81+
82+
-- CreateIndex
83+
CREATE UNIQUE INDEX "Dashboard_externalId_organizationId_key" ON "Dashboard"("externalId", "organizationId");
84+
85+
-- AddForeignKey
86+
ALTER TABLE "User" ADD CONSTRAINT "User_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
87+
88+
-- AddForeignKey
89+
ALTER TABLE "Dashboard" ADD CONSTRAINT "Dashboard_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
90+
91+
-- AddForeignKey
92+
ALTER TABLE "Dashboard" ADD CONSTRAINT "Dashboard_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
93+
94+
-- AddForeignKey
95+
ALTER TABLE "Report" ADD CONSTRAINT "Report_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
96+
97+
-- AddForeignKey
98+
ALTER TABLE "AuditLog" ADD CONSTRAINT "AuditLog_actorUserId_fkey" FOREIGN KEY ("actorUserId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Please do not edit this file manually
2+
# It should be added in your version-control system (e.g., Git)
3+
provider = "postgresql"
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
generator client {
2+
provider = "prisma-client-js"
3+
}
4+
5+
datasource db {
6+
provider = "postgresql"
7+
}
8+
9+
model Organization {
10+
id String @id @default(cuid())
11+
name String
12+
slug String @unique
13+
allowedEmailDomains String[]
14+
users User[]
15+
dashboards Dashboard[]
16+
reports Report[]
17+
createdAt DateTime @default(now())
18+
updatedAt DateTime @updatedAt
19+
}
20+
21+
model User {
22+
id String @id @default(cuid())
23+
name String
24+
email String @unique
25+
passwordHash String
26+
role Role
27+
organizationId String
28+
organization Organization @relation(fields: [organizationId], references: [id])
29+
dashboards Dashboard[]
30+
auditLogs AuditLog[]
31+
createdAt DateTime @default(now())
32+
updatedAt DateTime @updatedAt
33+
}
34+
35+
model Dashboard {
36+
id String @id @default(cuid())
37+
name String
38+
externalId String
39+
status DashboardStatus
40+
iframeUrl String?
41+
data Json?
42+
lastSyncAt DateTime?
43+
organizationId String
44+
organization Organization @relation(fields: [organizationId], references: [id])
45+
userId String?
46+
user User? @relation(fields: [userId], references: [id])
47+
createdAt DateTime @default(now())
48+
updatedAt DateTime @updatedAt
49+
50+
@@unique([externalId, organizationId])
51+
}
52+
53+
model Report {
54+
id String @id @default(cuid())
55+
title String
56+
description String?
57+
data Json?
58+
organizationId String
59+
organization Organization @relation(fields: [organizationId], references: [id])
60+
createdAt DateTime @default(now())
61+
}
62+
63+
model AuditLog {
64+
id String @id @default(cuid())
65+
actorUserId String
66+
actor User @relation(fields: [actorUserId], references: [id])
67+
action String
68+
targetType String
69+
targetId String?
70+
organizationId String
71+
metadata Json?
72+
createdAt DateTime @default(now())
73+
}
74+
75+
enum Role {
76+
ADMIN
77+
ANALYST
78+
}
79+
80+
enum DashboardStatus {
81+
ACTIVE
82+
INACTIVE
83+
ERROR
84+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import { PrismaClient } from "@prisma/client";
2+
import { PrismaPg } from "@prisma/adapter-pg";
3+
import bcrypt from "bcrypt";
4+
5+
const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL! });
6+
const prisma = new PrismaClient({ adapter });
7+
8+
async function main() {
9+
console.log("🌱 Seeding database...");
10+
11+
// 1. Create organization robust-6g
12+
const org = await prisma.organization.upsert({
13+
where: { slug: "robust-6g" },
14+
update: {},
15+
create: {
16+
name: "robust-6g",
17+
slug: "robust-6g",
18+
allowedEmailDomains: ["robust-6g.eu", "robust-6g.org"],
19+
},
20+
});
21+
console.log(`✅ Organization created: ${org.name} (${org.id})`);
22+
23+
// 2. Create ADMIN user
24+
const adminPasswordHash = await bcrypt.hash("Admin123!", 12);
25+
const admin = await prisma.user.upsert({
26+
where: { email: "admin@robust-6g.eu" },
27+
update: {},
28+
create: {
29+
name: "Admin User",
30+
email: "admin@robust-6g.eu",
31+
passwordHash: adminPasswordHash,
32+
role: "ADMIN",
33+
organizationId: org.id,
34+
},
35+
});
36+
console.log(`✅ Admin user created: ${admin.email}`);
37+
38+
// 3. Create ANALYST user
39+
const analystPasswordHash = await bcrypt.hash("Analyst123!", 12);
40+
const analyst = await prisma.user.upsert({
41+
where: { email: "analyst@robust-6g.eu" },
42+
update: {},
43+
create: {
44+
name: "Analyst User",
45+
email: "analyst@robust-6g.eu",
46+
passwordHash: analystPasswordHash,
47+
role: "ANALYST",
48+
organizationId: org.id,
49+
},
50+
});
51+
console.log(`✅ Analyst user created: ${analyst.email}`);
52+
53+
// 4. Create sample dashboard
54+
const dashboard = await prisma.dashboard.upsert({
55+
where: {
56+
externalId_organizationId: {
57+
externalId: "ext-dashboard-001",
58+
organizationId: org.id,
59+
},
60+
},
61+
update: {},
62+
create: {
63+
name: "Network Performance Overview",
64+
externalId: "ext-dashboard-001",
65+
status: "ACTIVE",
66+
iframeUrl: "https://api.example.com/dashboards/ext-dashboard-001/embed",
67+
organizationId: org.id,
68+
},
69+
});
70+
console.log(`✅ Dashboard created: ${dashboard.name}`);
71+
72+
console.log("🌱 Seeding complete!");
73+
}
74+
75+
main()
76+
.catch((e) => {
77+
console.error("❌ Seed error:", e);
78+
process.exit(1);
79+
})
80+
.finally(async () => {
81+
await prisma.$disconnect();
82+
});

0 commit comments

Comments
 (0)