diff --git a/sam/channel.go b/sam/channel.go index 6d29d8ea9..9c22a5414 100644 --- a/sam/channel.go +++ b/sam/channel.go @@ -1,8 +1,7 @@ package sam import ( - "fmt" - + "github.com/davecgh/go-spew/spew" "github.com/pkg/errors" "github.com/titpetric/factory" ) @@ -24,15 +23,14 @@ func (*Channel) Create(r *channelCreateRequest) (interface{}, error) { // @todo: channel name cmessage/log entry // @todo: permission check if user can add channel - c := Channel{}.New().SetName(r.name).SetTopic(r.topic) - if c.GetID() > 0 { - if is("topic", c.changed...) { - fmt.Println("Topic for channel was set:", c.GetTopic()) - } - return c, db.Replace("channel", c) - } - c.SetID(factory.Sonyflake.NextID()) - return c, db.Insert("channel", c) + c := Channel{}. + New(). + SetName(r.name). + SetTopic(r.topic). + SetMeta([]byte("{}")). + SetID(factory.Sonyflake.NextID()) + + return c, db.Insert("channels", c) } func (*Channel) Edit(r *channelEditRequest) (interface{}, error) { @@ -41,6 +39,11 @@ func (*Channel) Edit(r *channelEditRequest) (interface{}, error) { return nil, err } + var c *Channel + if c, err = c.load(r.id); 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 @@ -48,29 +51,29 @@ func (*Channel) Edit(r *channelEditRequest) (interface{}, error) { // @todo: handle channel moving // @todo: handle channel archiving - c := Channel{}.New().SetID(r.id).SetName(r.name).SetTopic(r.topic) - if c.GetID() > 0 { - if is("topic", c.changed...) { - fmt.Println("Topic for channel was changed:", c.GetTopic()) - } - return c, db.Replace("channel", c) - } + c.SetName(r.name).SetTopic(r.topic) + + return c, db.Replace("channels", c) - return c, db.Insert("channel", c) } -func (*Channel) Remove(r *channelRemoveRequest) (interface{}, error) { +func (*Channel) Delete(r *channelDeleteRequest) (interface{}, error) { db, err := factory.Database.Get() if err != nil { return nil, err } + var c *Channel + if c, err = c.load(r.id); err != nil { + return nil, err + } + // @todo: make history unavailable // @todo: notify users that channel has been removed (remove from web UI) // @todo: permissions check if user cah remove channel stmt := "UPDATE channels SET deleted_at = NOW() WHERE id = ? AND deleted_at IS NULL" - + spew.Dump(r.id) return nil, func() error { _, err := db.Exec(stmt, r.id) return err @@ -78,15 +81,7 @@ func (*Channel) Remove(r *channelRemoveRequest) (interface{}, error) { } 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, sqlChannelSelect+" AND id = ?", r.id) + return (&Channel{}).load(r.id) } func (*Channel) Search(r *channelSearchRequest) (interface{}, error) { @@ -102,3 +97,25 @@ func (*Channel) Search(r *channelSearchRequest) (interface{}, error) { err = db.Select(&res, sqlChannelSelect+" ORDER BY name ASC") return res, err } + +func (*Channel) load(id uint64) (*Channel, error) { + db, err := factory.Database.Get() + if err != nil { + return nil, err + } + + c := Channel{}.New() + + if id == 0 { + return nil, errors.New("Provide channel ID") + } else if err := db.Get(c, sqlChannelSelect+" AND id = ?", id); err != nil { + return nil, err + } else if c.ID != id { + spew.Dump(c) + return nil, errors.New("Unexisting channel") + } + + // @todo: permission check if user can read channel + + return c, nil +} diff --git a/sam/channel.handlers.go b/sam/channel.handlers.go index e2ebd1dce..41ab4b257 100644 --- a/sam/channel.handlers.go +++ b/sam/channel.handlers.go @@ -29,9 +29,9 @@ func (ch *ChannelHandlers) Edit(w http.ResponseWriter, r *http.Request) { params := channelEditRequest{}.new() resputil.JSON(w, params.Fill(r), func() (interface{}, error) { return ch.Channel.Edit(params) }) } -func (ch *ChannelHandlers) Remove(w http.ResponseWriter, r *http.Request) { - params := channelRemoveRequest{}.new() - resputil.JSON(w, params.Fill(r), func() (interface{}, error) { return ch.Channel.Remove(params) }) +func (ch *ChannelHandlers) Delete(w http.ResponseWriter, r *http.Request) { + params := channelDeleteRequest{}.new() + resputil.JSON(w, params.Fill(r), func() (interface{}, error) { return ch.Channel.Delete(params) }) } func (ch *ChannelHandlers) Read(w http.ResponseWriter, r *http.Request) { params := channelReadRequest{}.new() diff --git a/sam/channel.interfaces.go b/sam/channel.interfaces.go index 093bec950..71ff4d34f 100644 --- a/sam/channel.interfaces.go +++ b/sam/channel.interfaces.go @@ -34,7 +34,7 @@ func (ChannelHandlers) new() *ChannelHandlers { type ChannelAPI interface { Create(*channelCreateRequest) (interface{}, error) Edit(*channelEditRequest) (interface{}, error) - Remove(*channelRemoveRequest) (interface{}, error) + Delete(*channelDeleteRequest) (interface{}, error) Read(*channelReadRequest) (interface{}, error) Search(*channelSearchRequest) (interface{}, error) } @@ -43,7 +43,7 @@ type ChannelAPI interface { type ChannelHandlersAPI interface { Create(http.ResponseWriter, *http.Request) Edit(http.ResponseWriter, *http.Request) - Remove(http.ResponseWriter, *http.Request) + Delete(http.ResponseWriter, *http.Request) Read(http.ResponseWriter, *http.Request) Search(http.ResponseWriter, *http.Request) } diff --git a/sam/channel.request.go b/sam/channel.request.go index 07619a555..12c04f48a 100644 --- a/sam/channel.request.go +++ b/sam/channel.request.go @@ -93,16 +93,16 @@ func (c *channelEditRequest) Fill(r *http.Request) error { var _ RequestFiller = channelEditRequest{}.new() -// Channel remove request parameters -type channelRemoveRequest struct { +// Channel delete request parameters +type channelDeleteRequest struct { id uint64 } -func (channelRemoveRequest) new() *channelRemoveRequest { - return &channelRemoveRequest{} +func (channelDeleteRequest) new() *channelDeleteRequest { + return &channelDeleteRequest{} } -func (c *channelRemoveRequest) Fill(r *http.Request) error { +func (c *channelDeleteRequest) Fill(r *http.Request) error { r.ParseForm() get := map[string]string{} post := map[string]string{} @@ -119,7 +119,7 @@ func (c *channelRemoveRequest) Fill(r *http.Request) error { return nil } -var _ RequestFiller = channelRemoveRequest{}.new() +var _ RequestFiller = channelDeleteRequest{}.new() // Channel read request parameters type channelReadRequest struct { diff --git a/sam/docs/src/spec.json b/sam/docs/src/spec.json index e4e8ceab8..baaafbd69 100644 --- a/sam/docs/src/spec.json +++ b/sam/docs/src/spec.json @@ -219,7 +219,7 @@ } }, { - "name": "remove", + "name": "delete", "method": "DELETE", "title": "Remove channel", "parameters": { diff --git a/sam/docs/src/spec/channel.json b/sam/docs/src/spec/channel.json index bae327f8c..04699fe89 100644 --- a/sam/docs/src/spec/channel.json +++ b/sam/docs/src/spec/channel.json @@ -120,10 +120,10 @@ } }, { - "Name": "remove", + "Name": "delete", "Method": "DELETE", "Title": "Remove channel", - "Path": "/remove", + "Path": "/delete", "Parameters": { "get": [ { diff --git a/sam/routes.go b/sam/routes.go index a1303afbf..3e742ed4c 100644 --- a/sam/routes.go +++ b/sam/routes.go @@ -32,7 +32,7 @@ func MountRoutes(r chi.Router) { r.Route("/channel", func(r chi.Router) { r.Post("/create", channel.Create) r.Post("/edit", channel.Edit) - r.Delete("/remove", channel.Remove) + r.Delete("/delete", channel.Delete) r.Get("/read", channel.Read) r.Get("/search", channel.Search) })