Skip to content

Commit

Permalink
Set up backend
Browse files Browse the repository at this point in the history
  • Loading branch information
AliceeLe committed Feb 22, 2025
1 parent 3dd48d5 commit 847d92f
Show file tree
Hide file tree
Showing 6 changed files with 190 additions and 26 deletions.
73 changes: 73 additions & 0 deletions backend/api/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,5 +67,78 @@ def search_events():

return jsonify(results)

from flask import Flask, request, jsonify
from pymongo import MongoClient
import requests

app = Flask(__name__)
client = MongoClient("mongodb://localhost:27017/") # Update with your DB URI
db = client["cmucal"]
users_collection = db["users"]
events_collection = db["events"]

CALSERVER_URL = "https://calserver.example.com"
GCAL_API_URL = "https://www.googleapis.com/calendar/v3/calendars"

@app.route("/new_user", methods=["POST"])
def create_user():
data = request.json
if not data.get("email"):
return jsonify({"error": "Email is required"}), 400

users_collection.insert_one(data)

# Call calserver to create a user-specific CMUCal calendar
calserver_response = requests.post(f"{CALSERVER_URL}/create_calendar", json={"email": data["email"]})

# Sync to Google Calendar (stub, requires auth)
gcal_response = requests.post(f"{GCAL_API_URL}/primary/events", json={"summary": "CMUCal Events"})

return jsonify({"message": "User created", "calserver": calserver_response.json(), "gcal": gcal_response.json()})

@app.route("/user", methods=["GET"])
def get_user():
user_id = request.args.get("id")
email = request.args.get("email")
query = {"_id": user_id} if user_id else {"email": email}
user = users_collection.find_one(query)
if not user:
return jsonify({"error": "User not found"}), 404
return jsonify(user)

@app.route("/user", methods=["PUT"])
def update_user():
data = request.json
email = data.get("email")
if not email:
return jsonify({"error": "Email is required"}), 400
users_collection.update_one({"email": email}, {"$set": data})
return jsonify({"message": "User updated"})

@app.route("/events", methods=["GET"])
def get_events():
filters = request.args.to_dict()
events = list(events_collection.find(filters))
return jsonify(events)

@app.route("/update_user_calendar", methods=["POST"])
def update_user_calendar():
data = request.json
if not data.get("email") or not data.get("staged_events"):
return jsonify({"error": "Email and staged events are required"}), 400
response = requests.post(f"{CALSERVER_URL}/update_calendar", json=data)
return jsonify(response.json())

@app.route("/get_user_calendar", methods=["GET"])
def get_user_calendar():
email = request.args.get("email")
if not email:
return jsonify({"error": "Email is required"}), 400
response = requests.get(f"{CALSERVER_URL}/get_calendar", params={"email": email})
return jsonify(response.json())

if __name__ == "__main__":
app.run(debug=True)

if __name__ == "__main__":
app.run()
24 changes: 24 additions & 0 deletions backend/app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from flask import Flask, jsonify, request
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

@app.route('/', methods=['GET'])
def main():
data = {'message': 'Welcome to CMUCal!'}
return jsonify(data)

@app.route('/welcome', methods=['GET'])
def welcome():
data = {'message': 'Welcome to CMUCal!'}
return jsonify(data)

@app.route('/data', methods=['GET'])
def get_data():
data = {'message': 'Hello from Flask!'}
return jsonify(data)

if __name__ == '__main__':
app.run(debug=True)

63 changes: 58 additions & 5 deletions frontend/src/pages/SupportFeatureIdeas.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,65 @@
import React from 'react'
import React, { useState } from 'react'
import { FaHeart } from "react-icons/fa";
import { HiOutlineUserCircle } from "react-icons/hi";
import { IoAdd } from "react-icons/io5";

interface TipsContent {
title: string;
description: string;
date: string;
votes: BigInt;
note: React.ReactNode;
}

const FeatureCard = ({ title, description, date, votes, icon }: any) => (
<div className="bg-white border border-gray-200 shadow-sm rounded-lg p-4 flex flex-col gap-3">
<h3 className="text-teal text-2xl font-semibold">{title}</h3>
<p className="text-gray-600 text-sm line-clamp-3">{description}</p>
<div className="flex justify-between items-center mt-auto">
<div className="flex items-center gap-2">
{icon}
<span className="text-gray-500 text-sm">{date}</span>
</div>
<div className="flex items-center gap-1">
<FaHeart className="text-gray-500" />
<span className="text-gray-500 text-sm">{votes}</span>
</div>
</div>
</div>
);

const SupportFeatureIdeas: React.FC = () => {
return (
<div>
<h1>Support Feature Ideas</h1>
<div className='px-20 pt-16 pb-10 bg-[757575]'>
<h1 className="text-4xl pb-5 font-semibold text-teal">Feature Ideas Hub</h1>
<p className="pb-8">Welcome to the Feature Ideas Hub! Below, you'll find posts from our community sharing their ideas for new features and improvements. Browse through the suggestions, vote on your favorites, and contribute your own ideas to help us make CMUCal even better.</p>

<button
className="text-base rounded-lg border border-teal px-4 py-2 mb-8 ml-auto flex items-center gap-1 bg-teal text-white inline-flex mx-1 my-1"
style={{ minWidth: "7rem" }}
>
<IoAdd className="h-4 w-4 text-white mr-2" />
{"Post an idea"}
</button>

<div className="grid grid-cols-3 gap-4">
<FeatureCard title="New Feature Title"
description="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
date="Jun 30, 2024" votes="4" icon="s" />
<FeatureCard title="A very very very long new feature title" description="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
date="Jun 30, 2024" votes="4" icon="s" />
<FeatureCard title="New Feature Title" description="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
date="Jun 30, 2024" votes="4" icon="s" />
<FeatureCard title="New Feature Title"
description="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
date="Jun 30, 2024" votes="4" icon="s" />
<FeatureCard title="A very very very long new feature title" description="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
date="Jun 30, 2024" votes="4" icon="s" />
<FeatureCard title="New Feature Title" description="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
date="Jun 30, 2024" votes="4" icon="s" />
</div>
</div>
)
}


export {SupportFeatureIdeas};
export { SupportFeatureIdeas };
34 changes: 17 additions & 17 deletions frontend/src/pages/SupportTips.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ const addEvent: TipsContent = {
<li className="pb-3">
Apply any necessary filters to narrow down the search results.
</li>,
<img className="w-2/6 mb-4" src="../public/assets/support_2.png"/>,
<img className="w-2/6 mb-4" src="../public/assets/support_2.png" />,
<li className="pb-3">
Click <span className="border border-teal px-4 py-1 rounded-2xl">Add all</span>.
<ul className="list-disc pl-8 mt-2">
Expand All @@ -60,22 +60,22 @@ const addEvent: TipsContent = {
const deleteEvent: TipsContent = {
title: 'Delete events easily',
logo: <IoIosRemoveCircle />,
text:
<div className="flex items-center gap-2 flex-wrap">
<p>
Instead of using{" "}
<button
className="text-base rounded-full border border-teal px-4 py-2 flex items-center gap-1 bg-teal text-white inline-flex mx-1 my-1"
style={{ minWidth: "7rem" }}
>
<FaCheck className="h-4 w-4 text-white mr-2" />
{"Added"}
</button>{" "}
on event card on the left panel to remove events in the calendar view, you
can easily delete events directly from the calendar view. Follow these
steps:
</p>
</div>,
text:
<div className="flex items-center gap-2 flex-wrap">
<p>
Instead of using{" "}
<button
className="text-base rounded-full border border-teal px-4 py-2 flex items-center gap-1 bg-teal text-white inline-flex mx-1 my-1"
style={{ minWidth: "7rem" }}
>
<FaCheck className="h-4 w-4 text-white mr-2" />
{"Added"}
</button>{" "}
on event card on the left panel to remove events in the calendar view, you
can easily delete events directly from the calendar view. Follow these
steps:
</p>
</div>,
bulletPoints: [
<li className="pb-3">On the right calendar view, find the event you want to delete.</li>,
<li className="pb-3">
Expand Down
20 changes: 17 additions & 3 deletions frontend/src/pages/Welcome.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React from "react";
import React, { useEffect, useState } from "react";
import { GoogleLogin } from "@react-oauth/google";
import { useNavigate } from "react-router-dom";
import axios from "axios";
Expand Down Expand Up @@ -62,11 +62,26 @@ const Video: React.FC = () => {
};

const Welcome: React.FC = () => {
const [welcomeMessage, setWelcomeMessage] = useState("");

useEffect(() => {
const fetchWelcomeMessage = async () => {
try {
const response = await axios.get("/welcome");
setWelcomeMessage(response.data.message);
} catch (error) {
console.error("Error fetching welcome message:", error);
}
};

fetchWelcomeMessage();
}, []);

return (
<>
<div className="h-4/5 bg-lightgrey text-center">
<h1 className="text-black font-serif font-source-serif-pro text-[80px] font-normal leading-normal pt-28">
Welcome to CMUCal
{welcomeMessage || "Loading..."}
</h1>
<h2 className="text-black font-serif font-source-serif-pro text-[35px] font-normal leading-normal mb-12">
the all-in-one CMU resources platform
Expand All @@ -83,5 +98,4 @@ const Welcome: React.FC = () => {
</>
);
};

export { Welcome };
2 changes: 1 addition & 1 deletion frontend/vite.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ export default defineConfig({
server: {
proxy: {
'/api': {
target: 'http://localhost:5000',
target: 'http://127.0.0.1:5000/',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ''),
},
Expand Down

0 comments on commit 847d92f

Please sign in to comment.