Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions scripts/dropEmailIndex.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
const mongoose = require("mongoose");

const MONGODB_URI = process.env.MONGODB_URI || "mongodb://localhost:27017/test";

async function dropEmailIndex() {
try {
await mongoose.connect(MONGODB_URI);
console.log("Connected to MongoDB");

const db = mongoose.connection.db;
const collection = db.collection("icebreaker25");

const indexes = await collection.indexes();
console.log("Current indexes:", indexes);

try {
await collection.dropIndex("email_1");
console.log("Successfully dropped email_1 index");
} catch (error) {
if (error.code === 27) {
console.log("email_1 index does not exist");
} else {
throw error;
}
}

const newIndexes = await collection.indexes();
console.log("Remaining indexes:", newIndexes);

await mongoose.connection.close();
console.log("Done!");
} catch (error) {
console.error("Error:", error);
process.exit(1);
}
}

dropEmailIndex();
50 changes: 19 additions & 31 deletions src/app/api/icebreaker-register/route.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { NextResponse } from 'next/server';
import { connect } from "@/src/dbconfig/dbconfig";
import Icebreaker from "@/src/models/icebreakerModel";
import { NextResponse } from "next/server";

export async function POST(request) {
try {
Expand All @@ -9,9 +9,9 @@ export async function POST(request) {

if (!name || !usn) {
return NextResponse.json(
{
success: false,
message: 'Name and USN are required'
{
success: false,
message: "Name and USN are required",
},
{ status: 400 }
);
Expand All @@ -20,14 +20,14 @@ export async function POST(request) {
await connect();

const existingUser = await Icebreaker.findOne({
usn: usn.toUpperCase()
usn: usn.toUpperCase(),
});

if (existingUser) {
return NextResponse.json(
{
success: false,
message: 'This USN is already registered'
{
success: false,
message: "This USN is already registered",
},
{ status: 409 }
);
Expand All @@ -36,50 +36,38 @@ export async function POST(request) {
const newRegistration = await Icebreaker.create({
name: name.trim(),
usn: usn.trim().toUpperCase(),
questionForClub: questionForClub ? questionForClub.trim() : ""
questionForClub: questionForClub ? questionForClub.trim() : "",
});

return NextResponse.json(
{
success: true,
message: 'Registration successful! Get ready for the game!',
message: "Registration successful!",
data: {
id: newRegistration._id,
name: newRegistration.name,
usn: newRegistration.usn
}
usn: newRegistration.usn,
},
},
{ status: 201 }
);

} catch (error) {
console.error('Registration error:', error);

if (error.name === 'ValidationError') {
const errors = Object.values(error.errors).map(err => err.message);
return NextResponse.json(
{
success: false,
message: errors.join(', ')
},
{ status: 400 }
);
}
console.error("Registration error:", error);

if (error.code === 11000) {
return NextResponse.json(
{
success: false,
message: 'This USN is already registered'
{
success: false,
message: "This USN is already registered",
},
{ status: 409 }
);
}

return NextResponse.json(
{
success: false,
message: 'Something went wrong. Please try again.'
{
success: false,
message: "Registration failed. Please try again.",
},
{ status: 500 }
);
Expand Down
32 changes: 14 additions & 18 deletions src/components/IcebreakerForm/IcebreakerForm.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@ import styles from "./IcebreakerForm.module.css";
import { useIcebreakerForm } from "./useIcebreakerForm";

export default function IcebreakerForm() {
const {
formData,
errors,
isSubmitting,
submitStatus,
handleChange,
handleSubmit
const {
formData,
errors,
isSubmitting,
submitStatus,
handleChange,
handleSubmit
} = useIcebreakerForm();

const [registrationComplete, setRegistrationComplete] = useState(false);

useEffect(() => {
Expand All @@ -27,14 +27,14 @@ export default function IcebreakerForm() {
<div className={styles.successContainer}>
<div className={styles.successCard}>
<h3 className={styles.successTitle}>Registration Successful</h3>

<p className={styles.successMessage}>
Join our WhatsApp group for all the further updates and alongside tech talk, project colabs and meet likeminded peers.
Join our WhatsApp group for all the further updates and alongside tech talk, project colabs and meet likeminded peers.
</p>

<a
href="https://linktr.ee/CodeRIT"
target="_blank"
<a
href="https://linktr.ee/CodeRIT"
target="_blank"
rel="noopener noreferrer"
className={styles.whatsappButton}
>
Expand All @@ -60,7 +60,6 @@ export default function IcebreakerForm() {
onChange={handleChange}
placeholder="Enter your full name"
className={styles.input}
maxLength={100}
required
/>
</div>
Expand Down Expand Up @@ -90,20 +89,17 @@ export default function IcebreakerForm() {
<label className={styles.label} htmlFor="questionForClub">
Do you have any questions for the Club/ Seniors?
</label>
<div className={`${styles.textareaContainer} ${errors.questionForClub ? styles.error : ''}`}>
<div className={styles.textareaContainer}>
<textarea
id="questionForClub"
name="questionForClub"
value={formData.questionForClub}
onChange={handleChange}
placeholder="Ask us anything..."
className={styles.textarea}
maxLength={300}
rows={4}
/>
<span className={styles.charCount}>{formData.questionForClub.length}/300</span>
</div>
{errors.questionForClub && <span className={styles.errorMessage}>{errors.questionForClub}</span>}
</div>

{submitStatus.message && (
Expand Down
23 changes: 9 additions & 14 deletions src/components/IcebreakerForm/validation.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,14 @@
export const validateField = (name, value) => {
switch (name) {
case 'name':
if (!value.trim()) return 'Name is required';
if (value.length < 2) return 'Name must be at least 2 characters';
return '';

case 'usn':
if (!value.trim()) return 'USN is required';
return '';

case 'questionForClub':
if (value.length > 300) return 'Question cannot exceed 300 characters';
return '';

case "name":
if (!value.trim()) return "Name is required";
return "";

case "usn":
if (!value.trim()) return "USN is required";
return "";

default:
return '';
return "";
}
};
24 changes: 8 additions & 16 deletions src/models/icebreakerModel.js
Original file line number Diff line number Diff line change
@@ -1,39 +1,31 @@
import mongoose from 'mongoose';
import mongoose from "mongoose";

const IcebreakerSchema = new mongoose.Schema(
{
name: {
type: String,
required: [true, 'Name is required'],
required: true,
trim: true,
minlength: [2, 'Name must be at least 2 characters long'],
maxlength: [100, 'Name cannot exceed 100 characters']
},
usn: {
type: String,
required: [true, 'USN is required'],
required: true,
unique: true,
trim: true
trim: true,
},
questionForClub: {
type: String,
trim: true,
maxlength: [300, 'Question cannot exceed 300 characters'],
default: ""
default: "",
},
registeredAt: {
type: Date,
default: Date.now
}
},
{
timestamps: true,
collection: 'icebreaker25'
collection: "icebreaker25",
}
);

IcebreakerSchema.index({ usn: 1 });

const Icebreaker = mongoose.models.Icebreaker || mongoose.model('Icebreaker', IcebreakerSchema);
const Icebreaker =
mongoose.models.Icebreaker || mongoose.model("Icebreaker", IcebreakerSchema);

export default Icebreaker;