3
0

Implement channel CRUD++

/channel/remove changed to /channel/delete (pending /channel/:id)
This commit is contained in:
Denis Arh
2018-07-12 20:03:47 +02:00
parent ae14c23225
commit 6676d3a37c
7 changed files with 62 additions and 45 deletions
+47 -30
View File
@@ -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
}
+3 -3
View File
@@ -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()
+2 -2
View File
@@ -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)
}
+6 -6
View File
@@ -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 {
+1 -1
View File
@@ -219,7 +219,7 @@
}
},
{
"name": "remove",
"name": "delete",
"method": "DELETE",
"title": "Remove channel",
"parameters": {
+2 -2
View File
@@ -120,10 +120,10 @@
}
},
{
"Name": "remove",
"Name": "delete",
"Method": "DELETE",
"Title": "Remove channel",
"Path": "/remove",
"Path": "/delete",
"Parameters": {
"get": [
{
+1 -1
View File
@@ -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)
})