get peer's registered files

This commit is contained in:
afazio1
2024-04-22 03:56:13 -04:00
parent 9fe99e0d96
commit 89749d30ca
5 changed files with 57 additions and 13 deletions

View File

@@ -247,6 +247,7 @@ class FileFilterView(APIView):
professor_id = request.query_params.get("professor")
course_id = request.query_params.get("course")
semester_id = request.query_params.get("semester")
peer_id = request.query_params.get("peer_id")
# Check if provided filter IDs exist
if topic_id and not Topic.objects.filter(id=topic_id).exists():
@@ -269,6 +270,11 @@ class FileFilterView(APIView):
{"error": f"Semester with id {semester_id} does not exist"},
status=status.HTTP_400_BAD_REQUEST,
)
if peer_id and not PeerUser.objects.filter(id=peer_id).exists():
return Response(
{"error": f"Peer with id {peer_id} does not exist"},
status=status.HTTP_400_BAD_REQUEST,
)
# Start with the base queryset
queryset = File.objects.all()
@@ -282,16 +288,20 @@ class FileFilterView(APIView):
queryset = queryset.filter(course__id=course_id)
if semester_id:
queryset = queryset.filter(semester__id=semester_id)
queryset = queryset.annotate(
upvote_count=Count("upvotes"), downvote_count=Count("downvotes")
).order_by(F("downvote_count") - F("upvote_count"))
# Filter files based on active peers in the past hour
active_peer_ids = PeerUser.objects.filter(
last_poll__gte=timezone.now() - timedelta(hours=1)
).values_list("id", flat=True)
queryset = queryset.filter(peer_users__in=active_peer_ids).distinct()
if peer_id:
queryset = queryset.filter(peer_users__in=peer_id)
else:
active_peer_ids = PeerUser.objects.filter(
last_poll__gte=timezone.now() - timedelta(hours=1)
).values_list("id", flat=True)
queryset = queryset.filter(peer_users__in=active_peer_ids).distinct()
serializer = FileSerializer(queryset, many=True)
# Loop through each serialized file to sort its peer_users

View File

@@ -83,6 +83,13 @@ def request_file():
print("Error:", error)
return error, response.status_code
@app.route("/files", methods=["GET"])
def list_files():
files = os.listdir("./uploads")
newFiles = []
for file in files:
newFiles.append(file.split("_")[1])
return {"files": newFiles}, 200
@app.route("/request-tests", methods=["GET"])
def request_test_():

View File

@@ -1,22 +1,48 @@
import "../styles/RegisterFile.css";
import { RegisteredFile } from "../types/types";
import { RegisteredFile, Status } from "../types/types";
import { useState, useEffect } from "react";
import { getAuthHeaders } from "../utils/getAuthHeaders";
export default function RegisterFile() {
const [serverFiles, setServerFiles] = useState<RegisteredFile[]>([]);
const [registeredFiles, setRegisteredFiles] = useState<RegisteredFile[]>([]);
useEffect(() => {
fetchRegisteredFiles();
fetchServerFiles();
}, [])
const fetchRegisteredFiles = () => {
return
fetch("http://localhost:5000/files") // replace with local api endpoint
useEffect(() => {
fetch(`http://localhost:8080/files`, {
method: 'GET',
})
.then(response => response.json())
.then(data => {
setRegisteredFiles(data);
const files: string[] = data.files
setRegisteredFiles(
serverFiles.map((file) => {
if (files.includes(file.filename)) {
file.status = Status.HOSTED;
return file;
}
file.status = Status.PRIVATE;
return file;
})
)
})
.catch(error => console.error(error));
}, [serverFiles])
const fetchServerFiles = () => {
fetch(`http://localhost:8000/api/files/filter?peer_id=1`, {
method: 'GET',
headers: getAuthHeaders()
}) // replace with local api endpoint
.then(response => response.json())
.then(data => {
setServerFiles(data)
})
.catch(error => console.error(error));
}
const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault();
// handle file upload

View File

@@ -3,6 +3,7 @@ import { useLocation, useNavigate } from 'react-router-dom';
import styles from '../styles/Results.module.css'; // Make sure this path is correct
import { getAuthHeaders } from '../utils/getAuthHeaders';
import { File } from '../types/types';
import { Link } from 'react-router-dom';
const Results: React.FC = () => {
const [files, setFiles] = useState<File[]>([]);
@@ -113,7 +114,7 @@ function DownloadButton({ file }: { file: File }) {
<>
{
success === true ?
<p>Downloaded!</p> :
<Link to="/register">Downloaded!</Link> :
<button onClick={handleDownload}>Download</button>
}
</>

View File

@@ -38,7 +38,7 @@ export interface File {
downvotes: number[];
}
enum Status {
export enum Status {
HOSTED = "HOSTED",
PRIVATE = 'PRIVATE',
}