diff --git a/trello/cmd/app/app b/trello/cmd/app/app new file mode 100755 index 00000000..88d1e2d1 Binary files /dev/null and b/trello/cmd/app/app differ diff --git a/trello/cmd/app/main.go b/trello/cmd/app/main.go new file mode 100644 index 00000000..e34e8006 --- /dev/null +++ b/trello/cmd/app/main.go @@ -0,0 +1,90 @@ +package main + +import ( + "log" + "trello/internal" + entity "trello/internal/Entity" + user "trello/internal/User" +) + +func main() { + user1 := user.CreateUser("idASASXC", "Ayush", "ayu@gmail.com") + user2 := user.CreateUser("idLSYDIC", "Lucy", "ayu@gmail.com") + + project := internal.CreateManager() + project.AddUser(user1) + project.AddUser(user2) + + board1 := entity.CreateBoard("idBOARD2323", "INTERVIEW PREP", "PRIVATE") + board2 := entity.CreateBoard("idBOARD3454", "HOUSEHOLD", "PUBLIC") + + list1 := entity.CreateList("idLIST2334", "BINARY TREE QUES") + list2 := entity.CreateList("idLIST4564", "DP QUES") + + card1 := entity.CreateCard("idCARD2323", "Is This tree perfect?", "For a given tree, check if it is perfect : Google the meaning", nil) + card2 := entity.CreateCard("idCARD4322", "Print inorder traversal", "For a given tree, print the values in inorder traversal", user1) + + card3 := entity.CreateCard("idCARDe5w4", "LCS", "Find the Longest common subsequence in the given string", user2) + + // list3 := entity.CreateList("idLIST4564", "Groceries to buy") + + card4 := entity.CreateCard("idCARD8978", "Aloo", "buy Aloo macha", user1) + // card5 := entity.CreateCard("idCARD8978", "Jeera", "buy Jeera macha", user2) + + project.AddEntity(board1) + project.ShowEntitites(board1.Id) + log.Println("1-------------") + + project.UpdateBoard(board1.Id, "NAME", "Google Crack!", "", nil) + project.UpdateBoard(board1.Id, "PRIVACY", "", "PUBLIC", nil) + + project.ShowEntitites(board1.Id) + log.Println("2-------------") + + project.AddEntity(board2) + + project.UpdateBoard(board1.Id, "ADD_MEMBER", "", "", user1) + project.UpdateBoard(board1.Id, "ADD_MEMBER", "", "", user2) + + project.UpdateBoard(board1.Id, "REMOVE_MEMBER", "", "", user2) + + project.ShowEntitites(board1.Id) + log.Println("3-------------") + + project.ShowEntitites("") + log.Println("4-------------") + + project.AddEntity(list1) + project.ShowEntitites(list1.Id) + log.Println("5-------------") + + project.AddEntity(list2) + + project.ShowEntitites(board2.Id) + log.Println("6-------------") + + project.AddEntity(card1) + project.AddEntity(card2) + project.AddEntity(card3) + project.AddEntity(card4) + project.AddEntity(card4) + + project.AddChildToEntity(list1.Id, card1.Id) + project.AddChildToEntity(list1.Id, card2.Id) + + project.AddChildToEntity(board1.Id, list1.Id) + + project.ShowEntitites(list1.Id) + log.Println("7-------------") + + project.AddParentToEntity(list2.Id, card1.Id) + + project.ShowEntitites(list1.Id) + log.Println("8-------------") + project.ShowEntitites(list2.Id) + log.Println("9-------------") + + project.ShowEntitites("") + log.Println("10-------------") + +} diff --git a/trello/go.mod b/trello/go.mod new file mode 100644 index 00000000..04eaa235 --- /dev/null +++ b/trello/go.mod @@ -0,0 +1,3 @@ +module trello + +go 1.24.3 diff --git a/trello/internal/Entity/board.go b/trello/internal/Entity/board.go new file mode 100644 index 00000000..d0b71a7c --- /dev/null +++ b/trello/internal/Entity/board.go @@ -0,0 +1,109 @@ +package entity + +import ( + "log" + user "trello/internal/User" +) + +const ( + urlPrefix = "https://ayush.trello.com/boards/" +) + +type Board struct { + Entity + Privacy string + Url string + Members map[string]*user.User +} + +func CreateBoard(id, name, privacy string) *Board { + if privacy == "" { + privacy = "PRIVATE" + } + return &Board{ + Entity: Entity{ + Id: id, + Name: name, + ChildrenEntities: make(map[string]IEntity), + }, + Privacy: privacy, + Members: make(map[string]*user.User), + Url: urlPrefix + id, + } +} + +func (b *Board) Update(updateType string, name string, privacy string, member *user.User) { + switch updateType { + case "PRIVACY": + b.Privacy = privacy + break + case "NAME": + b.Name = name + break + case "ADD_MEMBER": + if member != nil { + b.AddMember(member) + } + break + case "REMOVE_MEMBER": + if member != nil { + b.RemoveMember(member) + } + break + } +} + +func (b *Board) AddMember(member *user.User) { + if _, ok := b.Members[member.Id]; ok { + log.Println("BOARD AddMember user " + member.Id + " already exists in board " + b.Id) + return + } + b.Members[member.Id] = member +} +func (b *Board) RemoveMember(member *user.User) { + if _, ok := b.Members[member.Id]; !ok { + log.Println("BOARD RemoveMember user " + member.Id + " does not exist in board " + b.Id) + return + } + delete(b.Members, member.Id) +} + +func (b *Board) AddChildEntity(childEntity IEntity) { + if childEntity.GetType() == "LIST" || childEntity.GetType() == "CARD" { + b.ChildrenEntities[childEntity.GetId()] = childEntity + } +} +func (b *Board) RemoveChildEntity(childEntity IEntity) { + delete(b.ChildrenEntities, childEntity.GetId()) +} + +func (b *Board) AddParent(newParent IEntity) { + log.Println("Board Cannot have a parent") +} + +func (b *Board) Show() { + log.Printf("BOARD :: id - %s, name - %s, privace - %s", b.Id, b.Name, b.Privacy) + if len(b.Members) > 0 { + log.Println("Members of this board:") + for _, v := range b.Members { + v.Show() + } + } + if len(b.ChildrenEntities) > 0 { + log.Printf("Entities under this board:") + for _, v := range b.ChildrenEntities { + v.Show() + } + } +} + +func (b *Board) Destroy() { + for k, v := range b.ChildrenEntities { + v.Destroy() + delete(b.ChildrenEntities, k) + } +} + +func (c *Board) GetType() string { + return "BOARD" +} diff --git a/trello/internal/Entity/card.go b/trello/internal/Entity/card.go new file mode 100644 index 00000000..6e617adf --- /dev/null +++ b/trello/internal/Entity/card.go @@ -0,0 +1,72 @@ +package entity + +import ( + "log" + user "trello/internal/User" +) + +type Card struct { + Entity + Desc string + Assignee *user.User +} + +func CreateCard(id string, name string, desc string, assignee *user.User) *Card { + return &Card{ + Entity: Entity{ + Name: name, + Id: id, + }, + Desc: desc, + Assignee: assignee, + } +} + +func (c *Card) Assign(assignee *user.User) { + c.Assignee = assignee +} + +func (c *Card) Update(updateType, name, desc string, assignee *user.User) { + + switch updateType { + case "NAME": + c.Name = name + break + case "DESC": + c.Desc = desc + break + case "ASSiGNEE": + c.Assignee = assignee + break + } +} + +func (c *Card) Show() { + assignedTo := "No One" + if c.Assignee != nil { + assignedTo = c.Assignee.Name + } + log.Printf("CARD :: id - %s, name - %s, desc - %s, assigned to - %s", c.Id, c.Name, c.Desc, assignedTo) +} + +func (c *Card) AddParent(newParent IEntity) { + if newParent.GetType() == "BOARD" || newParent.GetType() == "LIST" { + c.Parent = newParent + } else { + log.Println("Card cannot have parents other than BOARD or LIST") + } +} + +func (c *Card) AddChildEntity(childEntity IEntity) { + log.Println("Card cannot have a child Entity") +} +func (c *Card) RemoveChildEntity(childEntity IEntity) { + log.Println("Card cannot remove a child Entity") +} +func (c *Card) GetType() string { + return "CARD" +} + +func (c *Card) Destroy() { + +} diff --git a/trello/internal/Entity/entity.go b/trello/internal/Entity/entity.go new file mode 100644 index 00000000..715604a4 --- /dev/null +++ b/trello/internal/Entity/entity.go @@ -0,0 +1,27 @@ +package entity + +type Entity struct { + Id string + Name string + Parent IEntity + ChildrenEntities map[string]IEntity +} + +func (e *Entity) GetId() string { + return e.Id +} + +func (e *Entity) GetParent() IEntity { + return e.Parent +} + +type IEntity interface { + GetId() string + Show() + Destroy() + GetType() string + GetParent() IEntity + AddChildEntity(entity IEntity) + RemoveChildEntity(entity IEntity) + AddParent(parentEntity IEntity) +} diff --git a/trello/internal/Entity/list.go b/trello/internal/Entity/list.go new file mode 100644 index 00000000..daed6a03 --- /dev/null +++ b/trello/internal/Entity/list.go @@ -0,0 +1,61 @@ +package entity + +import "log" + +type List struct { + Entity +} + +func CreateList(id string, name string) *List { + return &List{ + Entity: Entity{ + Id: id, + Name: name, + ChildrenEntities: make(map[string]IEntity), + }, + } +} +func (l *List) Show() { + log.Printf("LIST :: id - %s, name - %s", l.Id, l.Name) + if len(l.ChildrenEntities) > 0 { + log.Printf("Cards under this list:") + for _, v := range l.ChildrenEntities { + v.Show() + } + } +} + +func (l *List) AddChildEntity(childEntity IEntity) { + if childEntity.GetType() == "CARD" { + l.ChildrenEntities[childEntity.GetId()] = childEntity + } +} + +func (l *List) RemoveChildEntity(childEntity IEntity) { + delete(l.ChildrenEntities, childEntity.GetId()) +} + +func (l *List) AddParent(newParent IEntity) { + if newParent.GetType() != "BOARD" { + log.Println("List cannot have a parent other than BOARD") + return + } + l.Parent = newParent +} + +func (l *List) Update(updateType string, name string) { + if updateType == "NAME" { + l.Name = name + } +} + +func (l *List) Destroy() { + for k, v := range l.ChildrenEntities { + v.Destroy() + delete(l.ChildrenEntities, k) + } +} + +func (c *List) GetType() string { + return "LIST" +} diff --git a/trello/internal/User/user.go b/trello/internal/User/user.go new file mode 100644 index 00000000..fb7a2e77 --- /dev/null +++ b/trello/internal/User/user.go @@ -0,0 +1,21 @@ +package user + +import "log" + +type User struct { + Id string + Name string + Email string +} + +func CreateUser(id, name, email string) *User { + return &User{ + Id: id, + Name: name, + Email: email, + } +} + +func (u *User) Show() { + log.Printf("User :: Id - %s, Name - %s, Email - %s", u.Id, u.Name, u.Email) +} diff --git a/trello/internal/manager.go b/trello/internal/manager.go new file mode 100644 index 00000000..03d4b1bc --- /dev/null +++ b/trello/internal/manager.go @@ -0,0 +1,84 @@ +package internal + +import ( + "fmt" + entity "trello/internal/Entity" + user "trello/internal/User" +) + +type ProjectManager struct { + currentId int + Users map[string]*user.User + Entities map[string]entity.IEntity +} + +func CreateManager() *ProjectManager { + return &ProjectManager{ + currentId: 0, + Users: make(map[string]*user.User), + Entities: make(map[string]entity.IEntity), + } +} + +func (pm *ProjectManager) AddUser(user *user.User) { + pm.Users[user.Id] = user +} + +func (pm *ProjectManager) AddEntity(projectEntity entity.IEntity) { + pm.Entities[projectEntity.GetId()] = projectEntity +} + +func (pm *ProjectManager) DeleteEntity(id string) { + deletedEntity := pm.Entities[id] + deletedEntity.Destroy() + delete(pm.Entities, id) +} + +func (pm *ProjectManager) AddParentToEntity(parentId string, childId string) { + parentEntity := pm.Entities[parentId] + childEntity := pm.Entities[childId] + previousParent := childEntity.GetParent() + if previousParent != nil { + previousParent.RemoveChildEntity(childEntity) + } + childEntity.AddParent(parentEntity) +} + +func (pm *ProjectManager) AddChildToEntity(parentId string, childId string) { + parentEntity := pm.Entities[parentId] + childEntity := pm.Entities[childId] + parentEntity.AddChildEntity(childEntity) + pm.AddParentToEntity(parentId, childId) +} + +func (pm *ProjectManager) ShowEntitites(id string) { + + if id == "" { + for _, v := range pm.Entities { + v.Show() + } + } else { + entityToShow := pm.Entities[id] + entityToShow.Show() + } +} + +func (pm *ProjectManager) UpdateBoard(id string, updateType string, name string, privacy string, member *user.User) { + board := pm.Entities[id].(*entity.Board) + board.Update(updateType, name, privacy, member) +} + +func (pm *ProjectManager) UpdateList(id string, updateType string, name string) { + list := pm.Entities[id].(*entity.List) + list.Update(updateType, name) +} + +func (pm *ProjectManager) UpdateCard(id string, updateType string, name string, desc string, assignee *user.User) { + card := pm.Entities[id].(*entity.Card) + card.Update(updateType, name, desc, assignee) +} + +func (pm *ProjectManager) GenerateUniqueId() string { + pm.currentId++ + return fmt.Sprintf("%v", pm.currentId) +}