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

View File

@@ -83,6 +83,13 @@ def request_file():
print("Error:", error) print("Error:", error)
return error, response.status_code 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"]) @app.route("/request-tests", methods=["GET"])
def request_test_(): def request_test_():

View File

@@ -1,22 +1,48 @@
import "../styles/RegisterFile.css"; import "../styles/RegisterFile.css";
import { RegisteredFile } from "../types/types"; import { RegisteredFile, Status } from "../types/types";
import { useState, useEffect } from "react"; import { useState, useEffect } from "react";
import { getAuthHeaders } from "../utils/getAuthHeaders";
export default function RegisterFile() { export default function RegisterFile() {
const [serverFiles, setServerFiles] = useState<RegisteredFile[]>([]);
const [registeredFiles, setRegisteredFiles] = useState<RegisteredFile[]>([]); const [registeredFiles, setRegisteredFiles] = useState<RegisteredFile[]>([]);
useEffect(() => { useEffect(() => {
fetchRegisteredFiles(); fetchServerFiles();
}, []) }, [])
const fetchRegisteredFiles = () => {
return useEffect(() => {
fetch("http://localhost:5000/files") // replace with local api endpoint fetch(`http://localhost:8080/files`, {
method: 'GET',
})
.then(response => response.json()) .then(response => response.json())
.then(data => { .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>) => { const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault(); event.preventDefault();
// handle file upload // 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 styles from '../styles/Results.module.css'; // Make sure this path is correct
import { getAuthHeaders } from '../utils/getAuthHeaders'; import { getAuthHeaders } from '../utils/getAuthHeaders';
import { File } from '../types/types'; import { File } from '../types/types';
import { Link } from 'react-router-dom';
const Results: React.FC = () => { const Results: React.FC = () => {
const [files, setFiles] = useState<File[]>([]); const [files, setFiles] = useState<File[]>([]);
@@ -113,7 +114,7 @@ function DownloadButton({ file }: { file: File }) {
<> <>
{ {
success === true ? success === true ?
<p>Downloaded!</p> : <Link to="/register">Downloaded!</Link> :
<button onClick={handleDownload}>Download</button> <button onClick={handleDownload}>Download</button>
} }
</> </>

View File

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