Implement channel CRUD++
/channel/remove changed to /channel/delete (pending /channel/:id)
This commit is contained in:
+47
-30
@@ -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
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -219,7 +219,7 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "remove",
|
||||
"name": "delete",
|
||||
"method": "DELETE",
|
||||
"title": "Remove channel",
|
||||
"parameters": {
|
||||
|
||||
@@ -120,10 +120,10 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"Name": "remove",
|
||||
"Name": "delete",
|
||||
"Method": "DELETE",
|
||||
"Title": "Remove channel",
|
||||
"Path": "/remove",
|
||||
"Path": "/delete",
|
||||
"Parameters": {
|
||||
"get": [
|
||||
{
|
||||
|
||||
+1
-1
@@ -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)
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user