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 0000000..b47423e Binary files /dev/null and b/attached_assets/Ballspielverein Borussia 09 e.V. Dortmund (Borussia Dortmund) _1759157727399.png differ diff --git a/attached_assets/Liverpool F.C. _1759157756392.png b/attached_assets/Liverpool F.C. _1759157756392.png new file mode 100644 index 0000000..a05a026 Binary files /dev/null and b/attached_assets/Liverpool F.C. _1759157756392.png differ 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 0000000..bc66159 Binary files /dev/null and b/attached_assets/Manchester City F.C. _1759157730506.png differ diff --git a/attached_assets/inter milan_1759157779359.png b/attached_assets/inter milan_1759157779359.png new file mode 100644 index 0000000..618ad99 Binary files /dev/null and b/attached_assets/inter milan_1759157779359.png differ diff --git a/attached_assets/다운로드_1759157749955.png b/attached_assets/다운로드_1759157749955.png new file mode 100644 index 0000000..618ad99 Binary files /dev/null and b/attached_assets/다운로드_1759157749955.png differ 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(), }, })