mirror of
https://github.com/philipredstone/relnet.git
synced 2025-06-17 05:01:24 +02:00
public networks now display correctly
This commit is contained in:
parent
524dc010d0
commit
c078610c4d
@ -7,11 +7,16 @@ const port = window.location.port;
|
||||
const API_URL = protocol + '//' + hostname + (port ? ':' + port : '') + '/api';
|
||||
|
||||
// Types
|
||||
export interface NetworkOwner {
|
||||
_id: string;
|
||||
username: string;
|
||||
}
|
||||
|
||||
export interface Network {
|
||||
_id: string;
|
||||
name: string;
|
||||
description?: string;
|
||||
owner: string;
|
||||
owner: string | NetworkOwner; // Can be either string ID or populated object
|
||||
isPublic: boolean;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
|
@ -1,9 +1,11 @@
|
||||
import React, { useState } from 'react';
|
||||
import { useNetworks } from '../../context/NetworkContext';
|
||||
import { useAuth } from '../../context/AuthContext';
|
||||
import { useNavigate } from 'react-router-dom';
|
||||
|
||||
const NetworkList: React.FC = () => {
|
||||
const { networks, loading, error, createNetwork, deleteNetwork } = useNetworks();
|
||||
const { user } = useAuth();
|
||||
const [showCreateForm, setShowCreateForm] = useState(false);
|
||||
const [newNetworkName, setNewNetworkName] = useState('');
|
||||
const [newNetworkDescription, setNewNetworkDescription] = useState('');
|
||||
@ -153,8 +155,20 @@ const NetworkList: React.FC = () => {
|
||||
)}
|
||||
</div>
|
||||
) : (
|
||||
<>
|
||||
{/* My Networks Section */}
|
||||
<div className="mb-8">
|
||||
<h2 className="text-xl font-semibold mb-4">My Networks</h2>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
||||
{networks.map((network) => (
|
||||
{networks
|
||||
.filter(network => {
|
||||
if (!user) return false;
|
||||
const ownerId = typeof network.owner === 'string'
|
||||
? network.owner
|
||||
: network.owner._id;
|
||||
return ownerId === user.id;
|
||||
})
|
||||
.map((network) => (
|
||||
<div key={network._id} className="bg-white rounded-lg shadow-md overflow-hidden">
|
||||
<div className="p-4">
|
||||
<h2 className="text-xl font-bold mb-2">{network.name}</h2>
|
||||
@ -187,6 +201,71 @@ const NetworkList: React.FC = () => {
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
{networks.filter(network => {
|
||||
if (!user) return false;
|
||||
const ownerId = typeof network.owner === 'string'
|
||||
? network.owner
|
||||
: network.owner._id;
|
||||
return ownerId === user.id;
|
||||
}).length === 0 && (
|
||||
<p className="text-gray-600 mb-4">You haven't created any networks yet.</p>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* Public Networks Section */}
|
||||
{networks.some(network => {
|
||||
if (!user) return false;
|
||||
const ownerId = typeof network.owner === 'string'
|
||||
? network.owner
|
||||
: network.owner._id;
|
||||
return ownerId !== user.id;
|
||||
}) && (
|
||||
<div>
|
||||
<h2 className="text-xl font-semibold mb-4">Public Networks From Others</h2>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
||||
{networks
|
||||
.filter(network => {
|
||||
if (!user) return false;
|
||||
const ownerId = typeof network.owner === 'string'
|
||||
? network.owner
|
||||
: network.owner._id;
|
||||
return ownerId !== user.id;
|
||||
})
|
||||
.map((network) => (
|
||||
<div key={network._id} className="bg-white rounded-lg shadow-md overflow-hidden border-l-4 border-green-500">
|
||||
<div className="p-4">
|
||||
<h2 className="text-xl font-bold mb-2">{network.name}</h2>
|
||||
{network.description && (
|
||||
<p className="text-gray-600 mb-4">{network.description}</p>
|
||||
)}
|
||||
<div className="flex items-center mb-4">
|
||||
<span className="px-2 py-1 rounded-full text-xs bg-green-100 text-green-800">
|
||||
Public
|
||||
</span>
|
||||
<span className="text-xs text-gray-500 ml-2">
|
||||
Created: {new Date(network.createdAt).toLocaleDateString()}
|
||||
</span>
|
||||
<span className="text-xs text-gray-500 ml-2">
|
||||
By: {typeof network.owner === 'string'
|
||||
? 'Unknown'
|
||||
: network.owner.username}
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex space-x-2">
|
||||
<button
|
||||
className="w-full bg-blue-500 hover:bg-blue-700 text-white py-2 px-4 rounded"
|
||||
onClick={() => navigate(`/networks/${network._id}`)}
|
||||
>
|
||||
View
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
|
@ -3,7 +3,7 @@ import Network from '../models/network.model';
|
||||
import { UserRequest } from '../types/express';
|
||||
import { validationResult } from 'express-validator';
|
||||
|
||||
// Get all networks for current user
|
||||
// Get all networks for current user and all public networks
|
||||
export const getUserNetworks = async (req: UserRequest, res: Response): Promise<void> => {
|
||||
try {
|
||||
if (!req.user) {
|
||||
@ -11,7 +11,15 @@ export const getUserNetworks = async (req: UserRequest, res: Response): Promise<
|
||||
return;
|
||||
}
|
||||
|
||||
const networks = await Network.find({ owner: req.user._id });
|
||||
// Find networks that either:
|
||||
// 1. Belong to the current user, OR
|
||||
// 2. Are public networks (created by any user)
|
||||
const networks = await Network.find({
|
||||
$or: [
|
||||
{ owner: req.user._id },
|
||||
{ isPublic: true }
|
||||
]
|
||||
}).populate('owner', 'username _id'); // Populate owner field with username
|
||||
|
||||
res.json({ success: true, data: networks });
|
||||
} catch (error) {
|
||||
@ -63,7 +71,7 @@ export const getNetwork = async (req: UserRequest, res: Response): Promise<void>
|
||||
return;
|
||||
}
|
||||
|
||||
const network = await Network.findById(networkId);
|
||||
const network = await Network.findById(networkId).populate('owner', 'username _id');
|
||||
|
||||
if (!network) {
|
||||
res.status(404).json({ message: 'Network not found' });
|
||||
@ -71,7 +79,7 @@ export const getNetwork = async (req: UserRequest, res: Response): Promise<void>
|
||||
}
|
||||
|
||||
// Check if user is owner or network is public
|
||||
if (network.owner.toString() !== req.user._id.toString() && !network.isPublic) {
|
||||
if (network.owner._id.toString() !== req.user._id.toString() && !network.isPublic) {
|
||||
res.status(403).json({ message: 'You do not have permission to access this network' });
|
||||
return;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user