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
42 changes: 42 additions & 0 deletions internal/handlers/columns.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package handlers

import (
"encoding/json"
"log"
"min-desk-backend/internal/models"
"net/http"
)

func initColumnsHandlers() {
router.HandleFunc("/columns", addColumn).Methods(http.MethodPost)
router.HandleFunc("/columns/{id}", deleteColumn).Methods(http.MethodDelete)
}

func addColumn(w http.ResponseWriter, r *http.Request) {
log.Println("Got request addColumn")
encoder := json.NewEncoder(w)
var columnInitUpdate models.ColumnUpdate
err := json.NewDecoder(r.Body).Decode(&columnInitUpdate)

if err != nil {
log.Println(err)
_ = encoder.Encode(&err)
}
columnId, err := models.AddColumnToDesk(columnInitUpdate)
if err != nil {
log.Println(err)
_ = encoder.Encode(&err)
}
err = encoder.Encode(&columnId)
}

func deleteColumn(w http.ResponseWriter, r *http.Request) {
encoder := json.NewEncoder(w)
columnId := getObjectIdFromRequest(r)
log.Printf("Got request deleteColumn. Id: %s \n", columnId)
err := models.DeleteColumnFromDesk(columnId)
if err != nil {
log.Println(err)
_ = encoder.Encode(&err)
}
}
1 change: 1 addition & 0 deletions internal/handlers/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ func InitRouter() *mux.Router {

initCardsHandlers()
initDesksHandlers()
initColumnsHandlers()

return router
}
9 changes: 3 additions & 6 deletions internal/handlers/desks.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"encoding/json"
"log"
"min-desk-backend/internal/models"
"min-desk-backend/internal/services"
"net/http"
)

Expand Down Expand Up @@ -34,12 +35,8 @@ func getDeskById(w http.ResponseWriter, r *http.Request) {
log.Println("Got request getDeskById")
encoder := json.NewEncoder(w)
deskId := getObjectIdFromRequest(r)
desk, err := models.GetDeskById(deskId)
if err != nil {
log.Println(err)
_ = encoder.Encode(err)
}
err = encoder.Encode(desk)
deskInfo := services.GetDeskInfoByDeskId(deskId)
err := encoder.Encode(deskInfo)
if err != nil {
log.Println(err)
_ = encoder.Encode(err)
Expand Down
53 changes: 48 additions & 5 deletions internal/models/cards.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ type Card struct {
Description string `json:"description,omitempty"`
AssignedTo string `json:"assignedTo,omitempty" bson:"assignedTo,omitempty"`
DueDate primitive.DateTime `json:"dueDate,omitempty" bson:"dueDate,omitempty"`
ColumnId primitive.ObjectID `json:"columnId,omitempty" bson:"columnId,omitempty"`
DeskId primitive.ObjectID `json:"deskId,omitempty" bson:"deskId,omitempty"`
}

Expand All @@ -23,31 +24,35 @@ type CardUpdate struct {
Description string `json:"description,omitempty"`
AssignedTo string `json:"assignedTo,omitempty" bson:"assignedTo,omitempty"`
DueDate string `json:"dueDate,omitempty" bson:"dueDate,omitempty"`
ColumnId string `json:"columnId,omitempty" bson:"columnId,omitempty"`
DeskId string `json:"deskId,omitempty" bson:"deskId,omitempty"`
}

var cardsCollectionName = "cards"
var cardsCollection *mongo.Collection

var CardAddAction = "CARD_ADD"
var CardRemoveAction = "CARD_REMOVE"

func InitCardsCollection() {
log.Println("Initialising CARDS collection...")
cardsCollection = mongodb.Collection(cardsCollectionName)
log.Println("CARDS collection initialised...")
}

// If you change size of test cards - test it too in test/models/cards_test.go:17
func AddTestCards(deskId primitive.ObjectID) {
func AddTestCards(columnId primitive.ObjectID, deskId primitive.ObjectID) {
cardsCollection.DeleteMany(context.Background(), bson.D{})
testCard1 := CardUpdate{"test name 1", "test description 1", "me1", "25-09-2020", deskId.Hex()}
testCard1 := CardUpdate{"test name 1", "test description 1", "me1", "25-09-2020", columnId.Hex(), deskId.Hex()}
_, _ = AddCard(testCard1)

testCard2 := CardUpdate{"test name 2", "test description 2", "me2", "31-12-2020", deskId.Hex()}
testCard2 := CardUpdate{"test name 2", "test description 2", "me2", "31-12-2020", columnId.Hex(), deskId.Hex()}
_, _ = AddCard(testCard2)

testCard3 := CardUpdate{"test name 3", "test description 3", "me3", "28-10-2020", deskId.Hex()}
testCard3 := CardUpdate{"test name 3", "test description 3", "me3", "28-10-2020", columnId.Hex(), deskId.Hex()}
_, _ = AddCard(testCard3)

testCard4 := CardUpdate{"test name 4", "test description 4", "me4", "26-05-2021", deskId.Hex()}
testCard4 := CardUpdate{"test name 4", "test description 4", "me4", "26-05-2021", columnId.Hex(), deskId.Hex()}
_, _ = AddCard(testCard4)
}

Expand Down Expand Up @@ -88,6 +93,24 @@ func GetAllCardsByDeskId(deskId primitive.ObjectID) []*Card {
return cards
}

func GetAllCardsByColumnId(columnId primitive.ObjectID) []*Card {
var cards []*Card
cursor, err := cardsCollection.Find(context.Background(), bson.D{{"columnId", columnId}})
if err != nil {
log.Println(err)
}
for cursor.Next(context.Background()) {
card := Card{}
err := cursor.Decode(&card)
if err != nil {
log.Println(err)
}
cards = append(cards, &card)
}

return cards
}

func GetCardById(cardId primitive.ObjectID) (Card, error) {
var card Card
err := cardsCollection.FindOne(context.Background(), bson.D{{"_id", cardId}}).Decode(&card)
Expand All @@ -104,6 +127,7 @@ func AddCard(cardUpdate CardUpdate) (primitive.ObjectID, error) {
card.Name = cardUpdate.Name
card.Description = cardUpdate.Description
card.AssignedTo = cardUpdate.AssignedTo
card.ColumnId, _ = primitive.ObjectIDFromHex(cardUpdate.ColumnId)
card.DeskId, _ = primitive.ObjectIDFromHex(cardUpdate.DeskId)

dueDate, err := time.Parse("02-01-2006", cardUpdate.DueDate)
Expand All @@ -117,6 +141,9 @@ func AddCard(cardUpdate CardUpdate) (primitive.ObjectID, error) {
log.Println(err)
return cardId, err
}

addCardToColumn(cardId, card.ColumnId)
log.Println("Add card to columnId:" + card.ColumnId.Hex())
return cardId, err
}

Expand All @@ -142,6 +169,12 @@ func EditCard(cardId primitive.ObjectID, cardUpdate CardUpdate) (Card, error) {
newDeskId, _ := primitive.ObjectIDFromHex(cardUpdate.DeskId)
updatedFields = append(updatedFields, bson.E{Key: "deskId", Value: newDeskId})
}
if len(cardUpdate.ColumnId) != 0 {
newColumnId, _ := primitive.ObjectIDFromHex(cardUpdate.ColumnId)
updatedFields = append(updatedFields, bson.E{Key: "columnId", Value: newColumnId})
removeCardFromColumn(cardId)
addCardToColumn(cardId, newColumnId)
}
if len(updatedFields) == 0 {
return GetCardById(cardId)
}
Expand All @@ -164,5 +197,15 @@ func DeleteCard(cardId primitive.ObjectID) error {
if err != nil {
log.Println(err)
}
removeCardFromColumn(cardId)
return err
}

func addCardToColumn(cardId primitive.ObjectID, columnId primitive.ObjectID) {
_ = UpdateColumnCards(columnId, cardId, CardAddAction)
}

func removeCardFromColumn(cardId primitive.ObjectID) {
card, _ := GetCardById(cardId)
_ = UpdateColumnCards(card.ColumnId, cardId, CardRemoveAction)
}
138 changes: 138 additions & 0 deletions internal/models/columns.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
package models

import (
"context"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
"log"
)

type Column struct {
Id primitive.ObjectID `json:"_id,omitempty" bson:"_id,omitempty"`
Name string `json:"name,omitempty"`
CardIds []primitive.ObjectID `json:"cardIds,omitempty" bson:"cardIds"`
DeskId primitive.ObjectID `json:"deskId,omitempty" bson:"deskId,omitempty"`
}

type ColumnUpdate struct {
Name string `json:"name,omitempty"`
DeskId string `json:"deskId,omitempty"`
}

var columnsCollectionName = "columns"
var columnsCollection *mongo.Collection

var ColumnAddAction = "COLUMN_ADD"
var ColumnRemoveAction = "COLUMN_REMOVE"

func InitColumnsCollection() {
log.Println("Initialising COLUMNS collection...")
columnsCollection = mongodb.Collection(columnsCollectionName)
log.Println("COLUMNS collection initialised...")
}

func AddTestColumns(deskId primitive.ObjectID) primitive.ObjectID {
columnsCollection.DeleteMany(context.Background(), bson.D{})
id, _ := AddColumnToDesk(ColumnUpdate{
Name: "To do",
DeskId: deskId.Hex(),
})
return id
}

func getColumnById(id primitive.ObjectID) (Column, error) {
var column Column
err := columnsCollection.FindOne(context.Background(), bson.D{{"_id", id}}).Decode(&column)
if err != nil {
log.Println("Error with getting column by id: " + id.String())
}
return column, err
}

func GetColumnsByDeskId(deskId primitive.ObjectID) []Column {
desk, _ := GetDeskById(deskId)
var columns []Column
for _, columnId := range desk.ColumnIds {
column, _ := getColumnById(columnId)
columns = append(columns, column)
}

return columns
}

func AddColumnToDesk(update ColumnUpdate) (primitive.ObjectID, error) {
deskId, _ := primitive.ObjectIDFromHex(update.DeskId)
columnId, _ := addColumnToCollection(update.Name, deskId)
err := UpdateDeskColumns(deskId, columnId, ColumnAddAction)
return columnId, err
}

func addColumnToCollection(name string, deskId primitive.ObjectID) (primitive.ObjectID, error) {
columnId := primitive.NewObjectID()
var column Column
column.Id = columnId
column.Name = name
column.DeskId = deskId
column.CardIds = []primitive.ObjectID{primitive.NewObjectID()}
column.CardIds = append(column.CardIds[:0], column.CardIds[1:]...)

_, err := columnsCollection.InsertOne(context.Background(), column)
if err != nil {
log.Println(err)
}

return columnId, err
}

func DeleteColumnFromDesk(columnId primitive.ObjectID) error {
column, _ := getColumnById(columnId)
for _, cardId := range column.CardIds {
_ = DeleteCard(cardId)
}
deskId := column.DeskId
_ = deleteColumnFromCollection(columnId)
err := UpdateDeskColumns(deskId, columnId, ColumnRemoveAction)
return err
}

func deleteColumnFromCollection(columnId primitive.ObjectID) error {
_, err := columnsCollection.DeleteOne(context.Background(), bson.D{{"_id", columnId}})
if err != nil {
log.Println(err)
}
return err
}

func UpdateColumnCards(columnId primitive.ObjectID, cardId primitive.ObjectID, action string) error {
var err error
log.Println("Update column cards " + columnId.Hex() + " " + cardId.Hex() + " " + action)
if action == CardAddAction {
err = addCardIdToColumn(cardId, columnId)
} else if action == CardRemoveAction {
err = removeCardIdFromColumn(cardId, columnId)
}
return err
}

func addCardIdToColumn(cardId primitive.ObjectID, columnId primitive.ObjectID) error {
log.Println("Add card " + cardId.Hex() + " to column " + columnId.Hex())
_, err := columnsCollection.UpdateOne(
context.Background(),
bson.M{"_id": columnId},
bson.D{
{"$push", bson.M{"cardIds": cardId}},
})
return err
}

func removeCardIdFromColumn(cardId primitive.ObjectID, columnId primitive.ObjectID) error {
log.Println("Add card " + cardId.Hex() + " to column " + columnId.Hex())
_, err := columnsCollection.UpdateOne(
context.Background(),
bson.M{"_id": columnId},
bson.D{
{"$pull", bson.M{"cardIds": cardId}},
})
return err
}
4 changes: 3 additions & 1 deletion internal/models/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,11 @@ func InitMongoDB(dataSource string) {

// Init collections
InitCardsCollection()
InitColumnsCollection()
InitDesksCollection()

// Init test data
testDeskId := AddTestDesks()[0]
AddTestCards(testDeskId)
testColumnId := AddTestColumns(testDeskId)
AddTestCards(testColumnId, testDeskId)
}
Loading