From 8cc09a61dc32ce8ad22530014d8c0c689cf965d5 Mon Sep 17 00:00:00 2001 From: kimjaehyeon0101 <47347352-kimjaehyeon0101@users.noreply.replit.com> Date: Mon, 29 Sep 2025 15:01:03 +0000 Subject: [PATCH] Improve admin access and navigation links for superadmins Update `App.tsx` to grant superadmin access to the admin dashboard and refactor navigation links to use `Link` component from `wouter`. Modify `DatabaseStorage` in `server/storage.ts` to update user records based on email instead of ID. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 069d4324-6c40-4355-955e-c714a50de1ea Replit-Commit-Checkpoint-Type: intermediate_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/3df548ff-50ae-432f-9be4-25d34eccc983/069d4324-6c40-4355-955e-c714a50de1ea/bVdKIaU --- .replit | 4 + ...und (Borussia Dortmund) _1759157727399.png | Bin 0 -> 4382 bytes .../Liverpool F.C. _1759157756392.png | Bin 0 -> 1938 bytes .../Manchester City F.C. _1759157730506.png | Bin 0 -> 8269 bytes attached_assets/inter milan_1759157779359.png | Bin 0 -> 4215 bytes attached_assets/다운로드_1759157749955.png | Bin 0 -> 4215 bytes client/src/App.tsx | 2 +- client/src/pages/Home.tsx | 33 +++++---- replit.md | 69 ++++++++++++++++++ server/storage.ts | 6 +- 10 files changed, 97 insertions(+), 17 deletions(-) create mode 100644 attached_assets/Ballspielverein Borussia 09 e.V. Dortmund (Borussia Dortmund) _1759157727399.png create mode 100644 attached_assets/Liverpool F.C. _1759157756392.png create mode 100644 attached_assets/Manchester City F.C. _1759157730506.png create mode 100644 attached_assets/inter milan_1759157779359.png create mode 100644 attached_assets/다운로드_1759157749955.png create mode 100644 replit.md diff --git a/.replit b/.replit index 310fc4d..535b600 100644 --- a/.replit +++ b/.replit @@ -14,6 +14,10 @@ run = ["npm", "run", "start"] localPort = 5000 externalPort = 80 +[[ports]] +localPort = 43349 +externalPort = 3000 + [env] PORT = "5000" diff --git a/attached_assets/Ballspielverein Borussia 09 e.V. Dortmund (Borussia Dortmund) _1759157727399.png b/attached_assets/Ballspielverein Borussia 09 e.V. Dortmund (Borussia Dortmund) _1759157727399.png new file mode 100644 index 0000000000000000000000000000000000000000..b47423eac4f128fb7afdda9a08e78de37c6b6e46 GIT binary patch literal 4382 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 YKVLdAOWKC*VE_OC07*qoM6N<$g2(VzmH+?% literal 0 HcmV?d00001 diff --git a/attached_assets/Liverpool F.C. _1759157756392.png b/attached_assets/Liverpool F.C. _1759157756392.png new file mode 100644 index 0000000000000000000000000000000000000000..a05a026d11f2d01875c5fb820f9f581e36ee1c0c GIT binary patch literal 1938 zcmV;D2W|L?P)f9S88&))M1kx2l!rxmN~Mm9Op4HWo={UB z5<&)%5Q`~F!VXDdO(jdSozPMw)@m|YwRB{Rrxk^aw6;G!=ezs$wM#SZ{nE_uJ@cJ= z&bjA%@8|Qm=X{>dhY^fm1S1&1{|~a}ty!~AThDu4TMrr{Cg8hmJ?u3tfULPJYu-CB z{1GhI);nI)0>CU>GBCCquFsmS+IYchT>zWoxvV)QYnI8H@mL$@;&W}h;I%G*-H`E7 ztbniMFW40SZsP@`+jvM9$eI&t^HO{P{}Nw)2mA~xweg-&Z9L?qkTqu|<-n}D8rv=! z=0f~DDNogTt0(1w+FlFy;2YQ&Kf+$PACqtuE=?r48oka0^t0H3JKA15Utc1Je%26-g<5|C=lJ z_a3+d@4}rpNUYdn@R_#g>~src%{bg77@vjlwZ8~S8PzxcPOO3V<2JmfUXR7!a0;$Z z%I6nawrK52 z2ke7~lX5fO2w5{qFwkTEGW=RFe}vc`E8-R$T>F<}M|>4;!e&W1x=lj662LL~>~!50 zf54bJG#g*Ue8Kz}p(sxjrf((|)VUwT(by;{suC2h);;X{LSXJ2b@tB#EQCV|7K8t7Z2CReiaG(&% zX=3Yal$8D2rm-^t3^0GBSn7`^WpdWc5PSb(VIJoRE&qt{0S?2X!gn|X6OuBy3pzW| z0a^1tink8B_liKLAHNd8%wBzCN8-yC`}*^RpYVa2Oc@Hg z^aO7a35|Z-BbNCAePfe_12jgglsoG9)TA8V6@5K)9SfX^FZ~Zwr{Ds-S>ynp!Rs+S zDLZ#Z;c%kCw+PQ}ClTx{4J!y8u&>Dd-(JUePRjJ9{_7Q@a{=^_HHQd~@14RIm^d(H zw3_lx%A~BBCK4-ild?`%bPe-l=p;-N8J^Ui46SHts_U`Z?}ff=XU(!*5j7M6RIT1S z(S19%sqNeQruCAYH$hSs2mGYI_F@KLcdbD#k&Z%_}QfVvn#@eB7n-k)Y`o=DJLi8 z;iQ}+G(Oy%lUte4g@NxR<(Y0s8WOT*O4cmQnnPb=&g`staF}%UFpL#&J!U24^p}`( zBqmhFI8?Nn606CNqeLawIl|trj2*IOnWQ{7F#r2P37#wb|Kmk+WN2v36|Oe?Iy{Z7 zM0oqSC~a9m1>dtcEBuVe68Aj5HE>Z<_HK*5p&@IQn9QhEUR&4pa#=Gm zYpz(z+)4FFZ3JDTl`W7pn~S|q+htb+%zz6CvjjpNo=QC_-0ZD zQ|zsv6)RAg*j7Y&FJiu820o4DMG&-#P?n33HFJaqcnx;O>Eirgk2dIB656x^^Tpxj z(opJkX7vV7$eI;*C_04w!M=kR+>%bIO;gf{(vQ6i1?a_?FISu?S(MsTdi6P(<~ z{30afmo3t{M55Zl!k3@o;93_ruWzj92De@S@p5=IYK3RxBK&y?bPT<8_tg-35jVmjLb)tMRFcklUneUYB1m7=#`kE|I?mdct<2FKb$D@(4Hz>UX(tl1YI z6UScbWzA7ZIYQ(D2{YKMBUm*l)9Uz#M4{xotT|cO|JB5)(dAk5IQC4+v2D=YLt86g ze^KD@5Dpdfy~ha#wiuYxGimDxvj>v$bW&Ckk>T#5X6RH=F#Rnwea{-f2u3i15wwB- Y0(0sC8_BPHkpKVy07*qoM6N<$f|h*4#{d8T literal 0 HcmV?d00001 diff --git a/attached_assets/Manchester City F.C. _1759157730506.png b/attached_assets/Manchester City F.C. _1759157730506.png new file mode 100644 index 0000000000000000000000000000000000000000..bc6615922d001a074261d0bab15bca765a665be8 GIT binary patch literal 8269 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 N002ovPDHLkV1g^8^8Ek+ literal 0 HcmV?d00001 diff --git a/attached_assets/다운로드_1759157749955.png b/attached_assets/다운로드_1759157749955.png new file mode 100644 index 0000000000000000000000000000000000000000..618ad9990bf08fb592c5cdd8ab72ec11b848385c GIT binary patch literal 4215 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 N002ovPDHLkV1g^8^8Ek+ literal 0 HcmV?d00001 diff --git a/client/src/App.tsx b/client/src/App.tsx index d3745a4..ece7fc8 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -26,7 +26,7 @@ function Router() { - {user?.role === 'admin' && ( + {(user?.role === 'admin' || user?.role === 'superadmin') && ( )} {user?.role === 'superadmin' && ( diff --git a/client/src/pages/Home.tsx b/client/src/pages/Home.tsx index a4c003b..41797bd 100644 --- a/client/src/pages/Home.tsx +++ b/client/src/pages/Home.tsx @@ -1,5 +1,6 @@ import { useState } from "react"; import { useQuery } from "@tanstack/react-query"; +import { Link } from "wouter"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { useAuth } from "@/hooks/useAuth"; @@ -39,13 +40,13 @@ export default function Home() { @@ -87,13 +88,15 @@ export default function Home() { - + + + @@ -129,9 +132,11 @@ export default function Home() {

Active Media Outlet Auctions

- + + +
{auctionsLoading ? ( diff --git a/replit.md b/replit.md new file mode 100644 index 0000000..100f5fb --- /dev/null +++ b/replit.md @@ -0,0 +1,69 @@ +# Overview + +SAPIENS is a comprehensive media platform that aggregates news and content from various media outlets organized into three categories: People, Topics, and Companies. The platform features a sophisticated auction system for media outlet management rights, prediction markets tied to articles, and a multi-tier admin system. Users can browse media outlets, read articles, participate in prediction markets, and bid on management rights through an eBay-style auction system. + +# User Preferences + +Preferred communication style: Simple, everyday language. + +# System Architecture + +## Frontend Architecture +- **Framework**: React with TypeScript using Vite for build tooling +- **Styling**: Tailwind CSS with shadcn/ui component library for consistent design +- **Routing**: Wouter for client-side routing +- **State Management**: TanStack Query for server state and data fetching +- **Authentication**: Integrated with Replit Auth system + +## Backend Architecture +- **Framework**: Express.js with TypeScript +- **Database**: PostgreSQL with Drizzle ORM for type-safe database operations +- **Authentication**: Replit-based OAuth with session management +- **API Design**: RESTful API with structured error handling + +## Database Design +The system uses a PostgreSQL database with the following core entities: +- **Users**: Supports role-based access (user, admin, superadmin) +- **Media Outlets**: Categorized entities (people, topics, companies) with slugs and metadata +- **Articles**: Content with rich text, images, and association to media outlets +- **Prediction Markets**: Betting markets linked to articles with yes/no pricing +- **Auctions**: eBay-style bidding system for media outlet management rights +- **Bids**: Individual auction bids with quality scoring +- **Comments**: User-generated content on articles + +## Authentication & Authorization +- **Multi-tier Access**: Three user roles with escalating permissions +- **Session Management**: PostgreSQL-backed sessions with configurable TTL +- **Route Protection**: Middleware-based authentication checks for protected routes + +## Key Features +- **Category-based Navigation**: Tabbed interface for People, Topics, Companies +- **Dual View Modes**: Grid and list views for article browsing +- **Auction System**: Real-time bidding with quality score integration +- **Prediction Markets**: Integration with external prediction market APIs +- **Admin Dashboards**: Role-specific management interfaces +- **Content Management**: Rich article creation and media outlet administration + +# External Dependencies + +## Database & Infrastructure +- **Neon Database**: Serverless PostgreSQL hosting +- **Drizzle ORM**: Type-safe database queries and migrations +- **Replit Auth**: OAuth authentication provider + +## UI & Styling +- **shadcn/ui**: Pre-built accessible UI components +- **Radix UI**: Primitive components for complex interactions +- **Tailwind CSS**: Utility-first CSS framework +- **Lucide Icons**: Icon library for consistent iconography + +## Development Tools +- **Vite**: Fast build tool with HMR for development +- **TypeScript**: Type safety across the full stack +- **TanStack Query**: Server state management and caching +- **React Hook Form**: Form handling with validation + +## Third-party Integrations +- **Kalshi API**: External prediction market data (referenced in user requirements) +- **Image Services**: Unsplash for placeholder images and media content +- **Session Storage**: connect-pg-simple for PostgreSQL session management \ No newline at end of file diff --git a/server/storage.ts b/server/storage.ts index b2ef626..e0c4ecb 100644 --- a/server/storage.ts +++ b/server/storage.ts @@ -86,9 +86,11 @@ export class DatabaseStorage implements IStorage { .insert(users) .values(userData) .onConflictDoUpdate({ - target: users.id, + target: users.email, set: { - ...userData, + firstName: userData.firstName, + lastName: userData.lastName, + profileImageUrl: userData.profileImageUrl, updatedAt: new Date(), }, })