From 7e62de70458437acc60e8519988dbb9ceed191d2 Mon Sep 17 00:00:00 2001 From: Tit Petric Date: Thu, 5 Jul 2018 10:34:07 +0200 Subject: [PATCH] implement most of the channel api --- sam/channel.go | 89 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 75 insertions(+), 14 deletions(-) diff --git a/sam/channel.go b/sam/channel.go index 547759b96..11cffe93c 100644 --- a/sam/channel.go +++ b/sam/channel.go @@ -2,26 +2,87 @@ package sam import ( "github.com/pkg/errors" + + "github.com/titpetric/factory" ) -func (c *Channel) Edit(r *channelEditRequest) (interface{}, error) { - return nil, errors.New("Not implemented: Channel.edit") +func (*Channel) Edit(r *channelEditRequest) (interface{}, error) { + db, err := factory.Database.Get() + if err != nil { + return nil, err + } + + // @todo: topic change message/log entry + // @todo: channel name change message/log entry + // @todo: permission check if user can edit channel + + c := Channel{}.new().SetID(r.id).SetName(r.name).SetTopic(r.topic) + if c.GetID() > 0 { + return c, db.Replace("channel", c) + } + c.SetID(factory.Sonyflake.NextID()) + return c, db.Insert("channel", c) } -func (c *Channel) Remove(r *channelRemoveRequest) (interface{}, error) { - return nil, errors.New("Not implemented: Channel.remove") + +func (*Channel) Remove(r *channelRemoveRequest) (interface{}, error) { + db, err := factory.Database.Get() + if err != nil { + return nil, err + } + + // @todo: don't actually delete the channel (mark as deleted, history becomes unavailable) + // @todo: notify users that channel has been removed (remove from web UI) + // @todo: permissions check if user cah remove channel + + return nil, func() error { + _, err := db.Exec("delete from channel where id=?", r.id) + return err + }() } -func (c *Channel) Read(r *channelReadRequest) (interface{}, error) { - return nil, errors.New("Not implemented: Channel.read") + +func (*Channel) Read(r *channelReadRequest) (interface{}, error) { + db, err := factory.Database.Get() + if err != nil { + return nil, err + } + + // @todo: permission check if user can read channel + + c := Channel{}.new() + return c, db.Get(c, "select * from channel where id=?", r.id) } -func (c *Channel) Search(r *channelSearchRequest) (interface{}, error) { - return nil, errors.New("Not implemented: Channel.search") + +func (*Channel) Search(r *channelSearchRequest) (interface{}, error) { + db, err := factory.Database.Get() + if err != nil { + return nil, err + } + + // @todo: permission check to return only channels that user has access to + // @todo: actual searching not just a full select + + res := make([]Channel, 0) + err = db.Select(&res, "select * from channel order by name asc") + return res, err } -func (c *Channel) Archive(r *channelArchiveRequest) (interface{}, error) { - return nil, errors.New("Not implemented: Channel.archive") + +func (*Channel) Archive(r *channelArchiveRequest) (interface{}, error) { + db, err := factory.Database.Get() + if err != nil { + return nil, err + } + + // @todo: don't actually delete the channel (mark as archived, history stays available) + // @todo: notify users that channel has been archived (last message - archival, disable new messages) + // @todo: permissions check if user cah archive channel + + return nil, func() error { + _, err = db.Exec("delete from channel where id=?", r.id) + return err + }() } -func (c *Channel) Move(r *channelMoveRequest) (interface{}, error) { + +func (*Channel) Move(r *channelMoveRequest) (interface{}, error) { + // @todo: move channel from r.source to r.destination (organisation) return nil, errors.New("Not implemented: Channel.move") } -func (c *Channel) Merge(r *channelMergeRequest) (interface{}, error) { - return nil, errors.New("Not implemented: Channel.merge") -}