1
0
mirror of https://github.com/Uttkarsh-raj/Plannerly.git synced 2025-11-29 21:57:34 +02:00
Files
Plannerly/Backend/controllers/tasks_controller.go

187 lines
5.2 KiB
Go
Raw Normal View History

2023-10-26 19:39:14 +05:30
package controllers
import (
"context"
"log"
"net/http"
2023-10-27 22:34:57 +05:30
"os"
2023-10-26 19:39:14 +05:30
"time"
"github.com/Uttkarsh-raj/To_Do_App/database"
"github.com/Uttkarsh-raj/To_Do_App/models"
2023-10-27 22:34:57 +05:30
"github.com/dgrijalva/jwt-go"
2023-10-26 19:39:14 +05:30
"github.com/gin-gonic/gin"
2023-10-27 22:34:57 +05:30
"go.mongodb.org/mongo-driver/bson"
2023-10-26 19:39:14 +05:30
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
)
var taskCollection *mongo.Collection = database.OpenCollection(database.Client, "tasks")
2023-10-27 22:34:57 +05:30
var SECRET_KEY = os.Getenv("SECRET_KEY")
2023-10-26 19:39:14 +05:30
func AddNewTask() gin.HandlerFunc {
return func(c *gin.Context) {
ctx, cancel := context.WithTimeout(context.Background(), 100*time.Second)
var task models.Task
2023-10-28 17:55:58 +05:30
defer cancel()
2023-10-26 19:39:14 +05:30
if err := c.BindJSON(&task); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
log.Print(task)
task.ID = primitive.NewObjectID()
validationError := validate.Struct(task)
if validationError != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": validationError.Error()})
}
resultInsertionNumber, insertErr := taskCollection.InsertOne(ctx, task)
if insertErr != nil {
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": "Task creation Failed!!"})
return
}
log.Print(resultInsertionNumber)
defer cancel()
response := gin.H{
"success": true,
"message": "Task created successfully",
"data": task, // Include the task data in the response.
}
c.JSON(http.StatusOK, response)
}
}
2023-10-27 22:34:57 +05:30
func UpdateTask() gin.HandlerFunc {
return func(c *gin.Context) {
2023-10-28 17:55:58 +05:30
taskId := c.Param("id")
var updateFields map[string]interface{}
if err := c.BindJSON(&updateFields); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"success": false, "error": err.Error()})
return
}
ctx, cancel := context.WithTimeout(context.Background(), 100*time.Second)
defer cancel()
objID, err := primitive.ObjectIDFromHex(taskId)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"success": false, "error": "Invalid ID format"})
return
}
update := bson.M{
"$set": updateFields,
}
2023-10-27 22:34:57 +05:30
2023-10-28 17:55:58 +05:30
// Check if the task exists before attempting to update it
var existingTask models.Task
err = taskCollection.FindOne(ctx, bson.M{"_id": objID}).Decode(&existingTask)
if err != nil {
c.JSON(http.StatusNotFound, gin.H{"success": false, "error": "Task not found"})
return
}
result, err := taskCollection.UpdateOne(ctx, bson.M{"_id": objID}, update)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": err.Error()})
return
}
err = taskCollection.FindOne(ctx, bson.M{"_id": objID}).Decode(&existingTask)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": err.Error()})
return
}
if result.ModifiedCount == 0 {
c.JSON(http.StatusOK, gin.H{"success": true, "data": existingTask})
return
}
c.JSON(http.StatusOK, gin.H{"success": true, "data": existingTask})
2023-10-27 22:34:57 +05:30
}
}
func GetTaskById() gin.HandlerFunc {
return func(c *gin.Context) {
ctx, cancel := context.WithTimeout(context.Background(), 100*time.Second)
var task models.Task
idParam := c.Param("id")
objID, err := primitive.ObjectIDFromHex(idParam)
2023-10-28 17:55:58 +05:30
defer cancel()
2023-10-27 22:34:57 +05:30
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"success": false, "error": "Invalid ID format"})
return
}
err = taskCollection.FindOne(ctx, bson.M{"_id": objID}).Decode(&task)
defer cancel()
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": err.Error()})
return
}
response := gin.H{
"success": true,
"data": task,
}
c.JSON(http.StatusOK, response)
}
}
func GetAllTask() gin.HandlerFunc {
return func(c *gin.Context) {
tokenString := c.GetHeader("token")
if tokenString == "" {
c.JSON(http.StatusUnauthorized, gin.H{"success": false, "error": "No token Provided"})
return
}
log.Print(tokenString)
token, err := jwt.Parse(tokenString, func(t *jwt.Token) (interface{}, error) { return []byte(SECRET_KEY), nil })
if err != nil {
c.JSON(http.StatusUnauthorized, gin.H{"success": false, "error": "Invalid Token"})
return
}
log.Print(token)
if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
log.Print("claims\n")
log.Print(claims)
user_id := claims["Uid"].(string)
// Now you have the user_id from the token
log.Print(user_id)
ctx, cancel := context.WithTimeout(context.Background(), 100*time.Second)
var tasks []models.Task
cursor, err := taskCollection.Find(ctx, bson.M{"user_id": user_id})
defer cancel()
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": err.Error()})
return
}
defer cursor.Close(ctx)
for cursor.Next(ctx) {
var task models.Task
if err := cursor.Decode(&task); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": err.Error()})
return
}
tasks = append(tasks, task)
}
if err := cursor.Err(); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": err.Error()})
return
}
response := gin.H{
"success": true,
"data": tasks,
}
c.JSON(http.StatusOK, response)
} else {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token"})
}
}
}