diff --git a/delegates/blogDelegate.go b/delegates/blogDelegate.go index 8b3c516..9d0fb40 100644 --- a/delegates/blogDelegate.go +++ b/delegates/blogDelegate.go @@ -84,6 +84,20 @@ func (d *MCDelegate) GetBlogByName(name string, start int64, end int64) *[]Blog return &rtn } +// GetAdminBlogByName GetAdminBlogByName +func (d *MCDelegate) GetAdminBlogByName(name string, start int64, end int64) *[]Blog { + var artn []Blog + astartStr := strconv.FormatInt(start, 10) + aendStr := strconv.FormatInt(end, 10) + abrq, err := d.buildRequest(http.MethodGet, "/rs/blog/admin/get/name/"+name+"/"+astartStr+"/"+aendStr, nil, adminKey) + if err == nil { + gsuc, stat := d.proxy.Do(abrq, &artn) + d.Log.Debug("suc: ", gsuc) + d.Log.Debug("stat: ", stat) + } + return &artn +} + // GetBlogList GetBlogList func (d *MCDelegate) GetBlogList(start int64, end int64) *[]Blog { var rtn []Blog diff --git a/delegates/blogDelegate_test.go b/delegates/blogDelegate_test.go index 53e37cd..b0f7cb7 100644 --- a/delegates/blogDelegate_test.go +++ b/delegates/blogDelegate_test.go @@ -300,6 +300,83 @@ func TestMCDelegate_GetBlogByName(t *testing.T) { } } + + +func TestMCDelegate_GetAdminBlogByName(t *testing.T) { + + // var proxy px.GoProxy + + var proxy px.MockGoProxy + proxy.MockDoSuccess1 = true + proxy.MockResp = &http.Response{ + Status: "200", + StatusCode: 200, + Body: ioutil.NopCloser(bytes.NewBufferString(`[{"id":5, "name":"test blog 12345--------"}]`)), + } + proxy.MockRespCode = 200 + + var l lg.Logger + log := l.New() + log.SetLogLevel(lg.AllLevel) + + type fields struct { + proxy px.Proxy + Log lg.Log + RestURL string + APIKey string + APIAdminKey string + } + type args struct { + name string + start int64 + end int64 + } + tests := []struct { + name string + fields fields + args args + want *Blog + wantID int64 + wantName string + wantLen int + }{ + // TODO: Add test cases. + { + name: "test 1", + fields: fields{ + proxy: proxy.New(), + Log: log, + RestURL: "http://localhost:3000", + APIAdminKey: "54211789991515", + APIKey: "557444414141", + }, + args: args{ + name: "test blog 12345--------", + start: 0, + end: 100, + }, + wantID: 5, + wantName: "test blog 12345--------", + wantLen: 1, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + d := &MCDelegate{ + proxy: tt.fields.proxy, + Log: tt.fields.Log, + RestURL: tt.fields.RestURL, + APIKey: tt.fields.APIKey, + APIAdminKey: tt.fields.APIAdminKey, + } + if got := d.GetAdminBlogByName(tt.args.name, tt.args.start, tt.args.end); len(*got) != tt.wantLen || + (*got)[0].ID != tt.wantID || (*got)[0].Name != tt.wantName { + t.Errorf("MCDelegate.GetBlogByName() = %v, want %v", got, tt.want) + } + }) + } +} + func TestMCDelegate_GetBlogList(t *testing.T) { // var proxy px.GoProxy diff --git a/delegates/delegate.go b/delegates/delegate.go index f48c556..25d491b 100644 --- a/delegates/delegate.go +++ b/delegates/delegate.go @@ -49,6 +49,7 @@ type Delegate interface { UpdateBlog(b *Blog) *Response GetBlog(bid int64) *Blog GetBlogByName(name string, start int64, end int64) *[]Blog + GetAdminBlogByName(name string, start int64, end int64) *[]Blog GetBlogList(start int64, end int64) *[]Blog GetAdminBlogList(start int64, end int64) *[]Blog ActivateBlog(b *Blog) *Response @@ -72,4 +73,7 @@ type Delegate interface { UpdateConfig(c *Config) *Response // UpdateConfig() GetConfig() *Config // GetConfig() + AddRule(r *Rule) *ResponseID + UpdateRule(r *Rule) *Response + GetRule() *Rule } diff --git a/delegates/mockDelegate.go b/delegates/mockDelegate.go index bde2f2b..44e6c76 100644 --- a/delegates/mockDelegate.go +++ b/delegates/mockDelegate.go @@ -83,6 +83,12 @@ type MockDelegate struct { MockConfig *Config MockUpdateConfigRes *Response + + MockAddRuleResp *ResponseID + + MockUpdateRuleResp *Response + + MockRule *Rule } // New New @@ -194,6 +200,11 @@ func (d *MockDelegate) GetBlogByName(name string, start int64, end int64) *[]Blo return d.MockBlogList } +// GetAdminBlogByName GetAdminBlogByName +func (d *MockDelegate) GetAdminBlogByName(name string, start int64, end int64) *[]Blog { + return d.MockBlogList +} + // GetBlogList GetBlogList func (d *MockDelegate) GetBlogList(start int64, end int64) *[]Blog { return d.MockBlogList @@ -283,3 +294,18 @@ func (d *MockDelegate) UpdateConfig(c *Config) *Response { func (d *MockDelegate) GetConfig() *Config { return d.MockConfig } + +// AddRule AddRule +func (d *MockDelegate) AddRule(r *Rule) *ResponseID { + return d.MockAddRuleResp +} + +// UpdateRule UpdateRule +func (d *MockDelegate) UpdateRule(r *Rule) *Response { + return d.MockUpdateRuleResp +} + +// GetRule GetRule +func (d *MockDelegate) GetRule() *Rule { + return d.MockRule +} diff --git a/delegates/mockDelegate_test.go b/delegates/mockDelegate_test.go index 8a75da3..8c460b6 100644 --- a/delegates/mockDelegate_test.go +++ b/delegates/mockDelegate_test.go @@ -1855,6 +1855,116 @@ func TestMockDelegate_GetBlogByName(t *testing.T) { } } +func TestMockDelegate_GetAdminBlogByName(t *testing.T) { + type fields struct { + MockAddUserResp *ResponseID + MockUpdateUserResp *Response + MockRole *Role + MockAddRoleResp *ResponseID + MockRoleList *[]Role + MockDeleteRoleResp *Response + MockAddUserAuthResp *ResponseID + MockUserAuthList *[]UserAuth + MockUser *User + MockBlogList *[]Blog + MockBlog *Blog + MockCommentList *[]Comment + MockLikeList *[]Like + MockAddBlogRes *ResponseID + MockUpdateBlogRes *Response + MockAddCommentRes *ResponseID + MockUpdateCommentRes *Response + MockAddLikeRes *ResponseID + MockRemoveLikeResp *Response + MockActivateRes *Response + MockDeActivateRes *Response + MockActivateCommentRes *Response + MockDeActivateCommentRes *Response + MockUserList *[]User + MockUnactivatedUserList *[]User + MockBannedUserList *[]User + MockEnableUser *Response + MockReactivateBannedUser *Response + MockDisableUser *Response + MockDisableUserForCause *Response + MockConfig *Config + MockUpdateConfigRes *Response + } + type args struct { + name string + start int64 + end int64 + } + tests := []struct { + name string + fields fields + args args + want *[]Blog + }{ + // TODO: Add test cases. + { + name: "test 1", + fields: fields{ + MockBlogList: &[]Blog{ + {ID: 5}, + {ID: 6}, + }, + }, + args: args{ + name: "test", + start: 0, + end: 10, + }, + + want: &[]Blog{ + {ID: 5}, + {ID: 6}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + d := &MockDelegate{ + MockAddUserResp: tt.fields.MockAddUserResp, + MockUpdateUserResp: tt.fields.MockUpdateUserResp, + MockRole: tt.fields.MockRole, + MockAddRoleResp: tt.fields.MockAddRoleResp, + MockRoleList: tt.fields.MockRoleList, + MockDeleteRoleResp: tt.fields.MockDeleteRoleResp, + MockAddUserAuthResp: tt.fields.MockAddUserAuthResp, + MockUserAuthList: tt.fields.MockUserAuthList, + MockUser: tt.fields.MockUser, + MockBlogList: tt.fields.MockBlogList, + MockBlog: tt.fields.MockBlog, + MockCommentList: tt.fields.MockCommentList, + MockLikeList: tt.fields.MockLikeList, + MockAddBlogRes: tt.fields.MockAddBlogRes, + MockUpdateBlogRes: tt.fields.MockUpdateBlogRes, + MockAddCommentRes: tt.fields.MockAddCommentRes, + MockUpdateCommentRes: tt.fields.MockUpdateCommentRes, + MockAddLikeRes: tt.fields.MockAddLikeRes, + MockRemoveLikeResp: tt.fields.MockRemoveLikeResp, + MockActivateRes: tt.fields.MockActivateRes, + MockDeActivateRes: tt.fields.MockDeActivateRes, + MockActivateCommentRes: tt.fields.MockActivateCommentRes, + MockDeActivateCommentRes: tt.fields.MockDeActivateCommentRes, + MockUserList: tt.fields.MockUserList, + MockUnactivatedUserList: tt.fields.MockUnactivatedUserList, + MockBannedUserList: tt.fields.MockBannedUserList, + MockEnableUser: tt.fields.MockEnableUser, + MockReactivateBannedUser: tt.fields.MockReactivateBannedUser, + MockDisableUser: tt.fields.MockDisableUser, + MockDisableUserForCause: tt.fields.MockDisableUserForCause, + MockConfig: tt.fields.MockConfig, + MockUpdateConfigRes: tt.fields.MockUpdateConfigRes, + } + if got := d.GetAdminBlogByName(tt.args.name, tt.args.start, tt.args.end); !reflect.DeepEqual(got, tt.want) { + t.Errorf("MockDelegate.GetBlogByName() = %v, want %v", got, tt.want) + } + }) + } +} + func TestMockDelegate_GetBlogList(t *testing.T) { type fields struct { MockAddUserResp *ResponseID @@ -3743,3 +3853,328 @@ func TestMockDelegate_DeleteBlog(t *testing.T) { }) } } + +func TestMockDelegate_AddRule(t *testing.T) { + type fields struct { + MockAddUserResp *ResponseID + MockUpdateUserResp *Response + MockRole *Role + MockAddRoleResp *ResponseID + MockRoleList *[]Role + MockDeleteRoleResp *Response + MockAddUserAuthResp *ResponseID + MockUserAuthList *[]UserAuth + MockUser *User + MockBlogList *[]Blog + MockBlog *Blog + MockCommentList *[]Comment + MockLikeList *[]Like + MockAddBlogRes *ResponseID + MockUpdateBlogRes *Response + MockAddCommentRes *ResponseID + MockUpdateCommentRes *Response + MockAddLikeRes *ResponseID + MockRemoveLikeResp *Response + MockActivateRes *Response + MockDeActivateRes *Response + MockDeleteBlogRes *Response + MockActivateCommentRes *Response + MockDeActivateCommentRes *Response + MockUserList *[]User + MockUnactivatedUserList *[]User + MockBannedUserList *[]User + MockEnableUser *Response + MockReactivateBannedUser *Response + MockDisableUser *Response + MockDisableUserForCause *Response + MockConfig *Config + MockUpdateConfigRes *Response + MockAddRuleResp *ResponseID + } + type args struct { + r *Rule + } + tests := []struct { + name string + fields fields + args args + want *ResponseID + }{ + // TODO: Add test cases. + { + name: "test 1", + fields: fields{ + MockAddRuleResp: &ResponseID{ + ID: 4, + Success: true, + }, + }, + args: args{ + r: &Rule{}, + }, + want: &ResponseID{ + ID: 4, + Success: true, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + d := &MockDelegate{ + MockAddUserResp: tt.fields.MockAddUserResp, + MockUpdateUserResp: tt.fields.MockUpdateUserResp, + MockRole: tt.fields.MockRole, + MockAddRoleResp: tt.fields.MockAddRoleResp, + MockRoleList: tt.fields.MockRoleList, + MockDeleteRoleResp: tt.fields.MockDeleteRoleResp, + MockAddUserAuthResp: tt.fields.MockAddUserAuthResp, + MockUserAuthList: tt.fields.MockUserAuthList, + MockUser: tt.fields.MockUser, + MockBlogList: tt.fields.MockBlogList, + MockBlog: tt.fields.MockBlog, + MockCommentList: tt.fields.MockCommentList, + MockLikeList: tt.fields.MockLikeList, + MockAddBlogRes: tt.fields.MockAddBlogRes, + MockUpdateBlogRes: tt.fields.MockUpdateBlogRes, + MockAddCommentRes: tt.fields.MockAddCommentRes, + MockUpdateCommentRes: tt.fields.MockUpdateCommentRes, + MockAddLikeRes: tt.fields.MockAddLikeRes, + MockRemoveLikeResp: tt.fields.MockRemoveLikeResp, + MockActivateRes: tt.fields.MockActivateRes, + MockDeActivateRes: tt.fields.MockDeActivateRes, + MockDeleteBlogRes: tt.fields.MockDeleteBlogRes, + MockActivateCommentRes: tt.fields.MockActivateCommentRes, + MockDeActivateCommentRes: tt.fields.MockDeActivateCommentRes, + MockUserList: tt.fields.MockUserList, + MockUnactivatedUserList: tt.fields.MockUnactivatedUserList, + MockBannedUserList: tt.fields.MockBannedUserList, + MockEnableUser: tt.fields.MockEnableUser, + MockReactivateBannedUser: tt.fields.MockReactivateBannedUser, + MockDisableUser: tt.fields.MockDisableUser, + MockDisableUserForCause: tt.fields.MockDisableUserForCause, + MockConfig: tt.fields.MockConfig, + MockUpdateConfigRes: tt.fields.MockUpdateConfigRes, + MockAddRuleResp: tt.fields.MockAddRuleResp, + } + if got := d.AddRule(tt.args.r); !reflect.DeepEqual(got, tt.want) { + t.Errorf("MockDelegate.AddRule() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestMockDelegate_UpdateRule(t *testing.T) { + type fields struct { + MockAddUserResp *ResponseID + MockUpdateUserResp *Response + MockRole *Role + MockAddRoleResp *ResponseID + MockRoleList *[]Role + MockDeleteRoleResp *Response + MockAddUserAuthResp *ResponseID + MockUserAuthList *[]UserAuth + MockUser *User + MockBlogList *[]Blog + MockBlog *Blog + MockCommentList *[]Comment + MockLikeList *[]Like + MockAddBlogRes *ResponseID + MockUpdateBlogRes *Response + MockAddCommentRes *ResponseID + MockUpdateCommentRes *Response + MockAddLikeRes *ResponseID + MockRemoveLikeResp *Response + MockActivateRes *Response + MockDeActivateRes *Response + MockDeleteBlogRes *Response + MockActivateCommentRes *Response + MockDeActivateCommentRes *Response + MockUserList *[]User + MockUnactivatedUserList *[]User + MockBannedUserList *[]User + MockEnableUser *Response + MockReactivateBannedUser *Response + MockDisableUser *Response + MockDisableUserForCause *Response + MockConfig *Config + MockUpdateConfigRes *Response + MockAddRuleResp *ResponseID + MockUpdateRuleResp *Response + } + type args struct { + r *Rule + } + tests := []struct { + name string + fields fields + args args + want *Response + }{ + // TODO: Add test cases. + { + name: "test 1", + fields: fields{ + MockUpdateRuleResp: &Response{ + Success: true, + }, + }, + args: args{ + r: &Rule{}, + }, + want: &Response{ + Success: true, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + d := &MockDelegate{ + MockAddUserResp: tt.fields.MockAddUserResp, + MockUpdateUserResp: tt.fields.MockUpdateUserResp, + MockRole: tt.fields.MockRole, + MockAddRoleResp: tt.fields.MockAddRoleResp, + MockRoleList: tt.fields.MockRoleList, + MockDeleteRoleResp: tt.fields.MockDeleteRoleResp, + MockAddUserAuthResp: tt.fields.MockAddUserAuthResp, + MockUserAuthList: tt.fields.MockUserAuthList, + MockUser: tt.fields.MockUser, + MockBlogList: tt.fields.MockBlogList, + MockBlog: tt.fields.MockBlog, + MockCommentList: tt.fields.MockCommentList, + MockLikeList: tt.fields.MockLikeList, + MockAddBlogRes: tt.fields.MockAddBlogRes, + MockUpdateBlogRes: tt.fields.MockUpdateBlogRes, + MockAddCommentRes: tt.fields.MockAddCommentRes, + MockUpdateCommentRes: tt.fields.MockUpdateCommentRes, + MockAddLikeRes: tt.fields.MockAddLikeRes, + MockRemoveLikeResp: tt.fields.MockRemoveLikeResp, + MockActivateRes: tt.fields.MockActivateRes, + MockDeActivateRes: tt.fields.MockDeActivateRes, + MockDeleteBlogRes: tt.fields.MockDeleteBlogRes, + MockActivateCommentRes: tt.fields.MockActivateCommentRes, + MockDeActivateCommentRes: tt.fields.MockDeActivateCommentRes, + MockUserList: tt.fields.MockUserList, + MockUnactivatedUserList: tt.fields.MockUnactivatedUserList, + MockBannedUserList: tt.fields.MockBannedUserList, + MockEnableUser: tt.fields.MockEnableUser, + MockReactivateBannedUser: tt.fields.MockReactivateBannedUser, + MockDisableUser: tt.fields.MockDisableUser, + MockDisableUserForCause: tt.fields.MockDisableUserForCause, + MockConfig: tt.fields.MockConfig, + MockUpdateConfigRes: tt.fields.MockUpdateConfigRes, + MockAddRuleResp: tt.fields.MockAddRuleResp, + MockUpdateRuleResp: tt.fields.MockUpdateRuleResp, + } + if got := d.UpdateRule(tt.args.r); !reflect.DeepEqual(got, tt.want) { + t.Errorf("MockDelegate.UpdateRule() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestMockDelegate_GetRule(t *testing.T) { + type fields struct { + MockAddUserResp *ResponseID + MockUpdateUserResp *Response + MockRole *Role + MockAddRoleResp *ResponseID + MockRoleList *[]Role + MockDeleteRoleResp *Response + MockAddUserAuthResp *ResponseID + MockUserAuthList *[]UserAuth + MockUser *User + MockBlogList *[]Blog + MockBlog *Blog + MockCommentList *[]Comment + MockLikeList *[]Like + MockAddBlogRes *ResponseID + MockUpdateBlogRes *Response + MockAddCommentRes *ResponseID + MockUpdateCommentRes *Response + MockAddLikeRes *ResponseID + MockRemoveLikeResp *Response + MockActivateRes *Response + MockDeActivateRes *Response + MockDeleteBlogRes *Response + MockActivateCommentRes *Response + MockDeActivateCommentRes *Response + MockUserList *[]User + MockUnactivatedUserList *[]User + MockBannedUserList *[]User + MockEnableUser *Response + MockReactivateBannedUser *Response + MockDisableUser *Response + MockDisableUserForCause *Response + MockConfig *Config + MockUpdateConfigRes *Response + MockAddRuleResp *ResponseID + MockUpdateRuleResp *Response + MockRule *Rule + } + tests := []struct { + name string + fields fields + want *Rule + }{ + // TODO: Add test cases. + { + name: "test 1", + fields: fields{ + MockRule: &Rule{ + ID: 4, + Content: "test", + }, + }, + + want: &Rule{ + ID: 4, + Content: "test", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + d := &MockDelegate{ + MockAddUserResp: tt.fields.MockAddUserResp, + MockUpdateUserResp: tt.fields.MockUpdateUserResp, + MockRole: tt.fields.MockRole, + MockAddRoleResp: tt.fields.MockAddRoleResp, + MockRoleList: tt.fields.MockRoleList, + MockDeleteRoleResp: tt.fields.MockDeleteRoleResp, + MockAddUserAuthResp: tt.fields.MockAddUserAuthResp, + MockUserAuthList: tt.fields.MockUserAuthList, + MockUser: tt.fields.MockUser, + MockBlogList: tt.fields.MockBlogList, + MockBlog: tt.fields.MockBlog, + MockCommentList: tt.fields.MockCommentList, + MockLikeList: tt.fields.MockLikeList, + MockAddBlogRes: tt.fields.MockAddBlogRes, + MockUpdateBlogRes: tt.fields.MockUpdateBlogRes, + MockAddCommentRes: tt.fields.MockAddCommentRes, + MockUpdateCommentRes: tt.fields.MockUpdateCommentRes, + MockAddLikeRes: tt.fields.MockAddLikeRes, + MockRemoveLikeResp: tt.fields.MockRemoveLikeResp, + MockActivateRes: tt.fields.MockActivateRes, + MockDeActivateRes: tt.fields.MockDeActivateRes, + MockDeleteBlogRes: tt.fields.MockDeleteBlogRes, + MockActivateCommentRes: tt.fields.MockActivateCommentRes, + MockDeActivateCommentRes: tt.fields.MockDeActivateCommentRes, + MockUserList: tt.fields.MockUserList, + MockUnactivatedUserList: tt.fields.MockUnactivatedUserList, + MockBannedUserList: tt.fields.MockBannedUserList, + MockEnableUser: tt.fields.MockEnableUser, + MockReactivateBannedUser: tt.fields.MockReactivateBannedUser, + MockDisableUser: tt.fields.MockDisableUser, + MockDisableUserForCause: tt.fields.MockDisableUserForCause, + MockConfig: tt.fields.MockConfig, + MockUpdateConfigRes: tt.fields.MockUpdateConfigRes, + MockAddRuleResp: tt.fields.MockAddRuleResp, + MockUpdateRuleResp: tt.fields.MockUpdateRuleResp, + MockRule: tt.fields.MockRule, + } + if got := d.GetRule(); !reflect.DeepEqual(got, tt.want) { + t.Errorf("MockDelegate.GetRule() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/delegates/model.go b/delegates/model.go index 72386f1..04f2745 100644 --- a/delegates/model.go +++ b/delegates/model.go @@ -78,3 +78,9 @@ type Config struct { AllowAutoPost bool `json:"allowAutoPost"` AllowAutoComment bool `json:"allowAutoComment"` } + +// Rule Rule +type Rule struct { + ID int64 `json:"id"` + Content string `json:"content"` +} diff --git a/delegates/ruleDelegate.go b/delegates/ruleDelegate.go new file mode 100644 index 0000000..e880af1 --- /dev/null +++ b/delegates/ruleDelegate.go @@ -0,0 +1,69 @@ +package delegates + +import ( + "encoding/json" + "net/http" +) + +/* + Copyright (C) 2023 Ulbora Labs LLC. (www.ulboralabs.com) + All rights reserved. + Copyright (C) 2023 Ken Williamson + All rights reserved. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +// AddRule AddRule +func (d *MCDelegate) AddRule(r *Rule) *ResponseID { + var arrtn ResponseID + aJSON, err := json.Marshal(r) + if err == nil { + brq, err := d.buildRequest(http.MethodPost, "/rs/rule/add", aJSON, adminKey) + if err == nil { + suc, stat := d.proxy.Do(brq, &arrtn) + arrtn.Code = int64(stat) + d.Log.Debug("suc: ", suc) + d.Log.Debug("stat: ", stat) + } + } + d.Log.Debug("rtn: ", arrtn) + return &arrtn +} + +// UpdateRule UpdateRule +func (d *MCDelegate) UpdateRule(r *Rule) *Response { + var urrtn Response + aJSON, err := json.Marshal(r) + if err == nil { + rq, err := d.buildRequest(http.MethodPut, "/rs/rule/update", aJSON, adminKey) + if err == nil { + usuc, stat := d.proxy.Do(rq, &urrtn) + urrtn.Code = int64(stat) + d.Log.Debug("suc: ", usuc) + d.Log.Debug("stat: ", stat) + } + } + d.Log.Debug("rtn: ", urrtn) + return &urrtn +} + +// GetRule GetRule +func (d *MCDelegate) GetRule() *Rule { + var rtn Rule + brq, err := d.buildRequest(http.MethodGet, "/rs/rule/get", nil, adminKey) + if err == nil { + gsuc, stat := d.proxy.Do(brq, &rtn) + d.Log.Debug("suc: ", gsuc) + d.Log.Debug("stat: ", stat) + } + return &rtn +} diff --git a/delegates/ruleDelegate_test.go b/delegates/ruleDelegate_test.go new file mode 100644 index 0000000..9e84e03 --- /dev/null +++ b/delegates/ruleDelegate_test.go @@ -0,0 +1,216 @@ +package delegates + +import ( + "bytes" + "io/ioutil" + "net/http" + "reflect" + "testing" + + px "github.com/GolangToolKits/go-http-proxy" + lg "github.com/GolangToolKits/go-level-logger" +) + +func TestMCDelegate_AddRule(t *testing.T) { + + // var proxy px.GoProxy + + var proxy px.MockGoProxy + proxy.MockDoSuccess1 = true + proxy.MockResp = &http.Response{ + Status: "200", + StatusCode: 200, + Body: ioutil.NopCloser(bytes.NewBufferString(`{"success":true, "id":5}`)), + } + proxy.MockRespCode = 200 + + var l lg.Logger + log := l.New() + log.SetLogLevel(lg.AllLevel) + + type fields struct { + proxy px.Proxy + Log lg.Log + RestURL string + APIKey string + APIAdminKey string + } + type args struct { + r *Rule + } + tests := []struct { + name string + fields fields + args args + want *ResponseID + }{ + // TODO: Add test cases. + { + name: "test 1", + fields: fields{ + proxy: proxy.New(), + Log: log, + RestURL: "http://localhost:3000", + APIAdminKey: "54211789991515", + APIKey: "557444414141", + }, + args: args{ + r: &Rule{ + Content: "just some rule more content !!!!!!", + }, + }, + want: &ResponseID{ + ID: 5, + Success: true, + Code: 200, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + d := &MCDelegate{ + proxy: tt.fields.proxy, + Log: tt.fields.Log, + RestURL: tt.fields.RestURL, + APIKey: tt.fields.APIKey, + APIAdminKey: tt.fields.APIAdminKey, + } + if got := d.AddRule(tt.args.r); !reflect.DeepEqual(got, tt.want) { + t.Errorf("MCDelegate.AddRule() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestMCDelegate_UpdateRule(t *testing.T) { + + // var proxy px.GoProxy + + var proxy px.MockGoProxy + proxy.MockDoSuccess1 = true + proxy.MockResp = &http.Response{ + Status: "200", + StatusCode: 200, + Body: ioutil.NopCloser(bytes.NewBufferString(`{"success":true}`)), + } + proxy.MockRespCode = 200 + + var l lg.Logger + log := l.New() + log.SetLogLevel(lg.AllLevel) + + type fields struct { + proxy px.Proxy + Log lg.Log + RestURL string + APIKey string + APIAdminKey string + } + type args struct { + r *Rule + } + tests := []struct { + name string + fields fields + args args + want *Response + }{ + // TODO: Add test cases. + { + name: "test 1", + fields: fields{ + proxy: proxy.New(), + Log: log, + RestURL: "http://localhost:3000", + APIAdminKey: "54211789991515", + APIKey: "557444414141", + }, + args: args{ + r: &Rule{ + ID: 2, + Content: "just some rule update more content !!!!!!", + }, + }, + want: &Response{ + Success: true, + Code: 200, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + d := &MCDelegate{ + proxy: tt.fields.proxy, + Log: tt.fields.Log, + RestURL: tt.fields.RestURL, + APIKey: tt.fields.APIKey, + APIAdminKey: tt.fields.APIAdminKey, + } + if got := d.UpdateRule(tt.args.r); !reflect.DeepEqual(got, tt.want) { + t.Errorf("MCDelegate.UpdateRule() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestMCDelegate_GetRule(t *testing.T) { + + // var proxy px.GoProxy + + var proxy px.MockGoProxy + proxy.MockDoSuccess1 = true + proxy.MockResp = &http.Response{ + Status: "200", + StatusCode: 200, + Body: ioutil.NopCloser(bytes.NewBufferString(`{"id":2, "content": "test"}`)), + } + proxy.MockRespCode = 200 + + var l lg.Logger + log := l.New() + log.SetLogLevel(lg.AllLevel) + + type fields struct { + proxy px.Proxy + Log lg.Log + RestURL string + APIKey string + APIAdminKey string + } + tests := []struct { + name string + fields fields + want *Rule + }{ + // TODO: Add test cases. + { + name: "test 1", + fields: fields{ + proxy: proxy.New(), + Log: log, + RestURL: "http://localhost:3000", + APIAdminKey: "54211789991515", + APIKey: "557444414141", + }, + + want: &Rule{ + ID: 2, + Content: "test", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + d := &MCDelegate{ + proxy: tt.fields.proxy, + Log: tt.fields.Log, + RestURL: tt.fields.RestURL, + APIKey: tt.fields.APIKey, + APIAdminKey: tt.fields.APIAdminKey, + } + if got := d.GetRule(); !reflect.DeepEqual(got, tt.want) { + t.Errorf("MCDelegate.GetRule() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/handlers/adminBlogHandler.go b/handlers/adminBlogHandler.go index b3f5857..66dc965 100644 --- a/handlers/adminBlogHandler.go +++ b/handlers/adminBlogHandler.go @@ -117,6 +117,95 @@ func (h *MCHandler) GetAdminBlogList(w http.ResponseWriter, r *http.Request) { } } +// SearchAdminBlogList SearchAdminBlogList +func (h *MCHandler) SearchAdminBlogList(w http.ResponseWriter, r *http.Request) { + fmt.Println("in SearchAdminBlogList") + aas, suc := h.getSession(r) + h.Log.Debug("session suc in SearchAdminBlogList", suc) + if suc { + loggedInAuth := aas.Get("loggedIn") + var isAdmin = aas.Get("isAdmin") + h.Log.Debug("loggedIn in SearchAdminBlogList: ", loggedInAuth) + if loggedInAuth == true && isAdmin == true { + name := r.FormValue("name") + sblogList := h.Delegate.GetAdminBlogByName(name, 0, maxPosts) + h.Log.Debug("blogCnt: ", len(*sblogList)) + var sbp BlogPage + sbp.Title = h.Title + sbp.Desc = h.Desc + sbp.KeyWords = h.KeyWords + uemail := aas.Get("userEmail") + if uemail != nil { + sbp.MyEmail = uemail.(string) + } + var isAdmin = aas.Get("isAdmin") + h.Log.Debug("isAdmin: ", isAdmin) + if isAdmin == true { + sbp.IsAdmin = true + } + var ablst []Blog + for i := range *sblogList { + var wg sync.WaitGroup + var asbb Blog + asbb.Blog = &(*sblogList)[i] + txt, err := b64.StdEncoding.DecodeString(asbb.Blog.Content) + if err == nil { + asbb.Blog.Content = string(txt) + asbb.Blog.Content = strings.Replace(asbb.Blog.Content, stripOut, "", -1) + asbb.Blog.Content = strings.Replace(asbb.Blog.Content, stripOut2, "", -1) + asbb.Blog.Content = strings.Replace(asbb.Blog.Content, stripOut3, "", -1) + asbb.Blog.Content = strings.Replace(asbb.Blog.Content, stripOut4, "", -1) + + asbb.TextHTML = template.HTML(asbb.Blog.Content) + h.Log.Debug("TextHTML: ", asbb.TextHTML) + } + + wg.Add(1) + go func(bbb *Blog) { + defer wg.Done() + cl := h.Delegate.GetCommentList(bbb.Blog.ID, 0, maxComments) + h.Log.Debug("commentCnt: ", len(*cl)) + bbb.CommentCnt = len(*cl) + h.Log.Debug("Comments Done: ") + }(&asbb) + wg.Add(1) + go func(bbb *Blog) { + defer wg.Done() + ll := h.Delegate.ViewLikes(bbb.Blog.ID) + for _, l := range *ll { + if l.UserID == bbb.Blog.UserID { + bbb.Liked = true + } + } + h.Log.Debug("likeCnt: ", len(*ll)) + bbb.LikeCnt = len(*ll) + h.Log.Debug("Views Done: ") + }(&asbb) + + wg.Add(1) + go func(bbb *Blog) { + defer wg.Done() + u1 := h.Delegate.GetUserByID(bbb.Blog.UserID) + h.Log.Debug("get user: ") + bbb.User = u1 + bbb.UserImage = b64.StdEncoding.EncodeToString(bbb.User.Image) + h.Log.Debug("User Done: ") + }(&asbb) + + wg.Wait() + + ablst = append(ablst, asbb) + } + sbp.BlogList = &ablst + h.Log.Debug("after all waits") + + h.AdminTemplates.ExecuteTemplate(w, adminBlogListPage, &sbp) + } else { + http.Redirect(w, r, loginRt, http.StatusFound) + } + } +} + // ActivateBlog ActivateBlog func (h *MCHandler) ActivateBlog(w http.ResponseWriter, r *http.Request) { fmt.Println("in Activate Blog") diff --git a/handlers/adminBlogHandler_test.go b/handlers/adminBlogHandler_test.go index 3caaa71..81ebc1e 100644 --- a/handlers/adminBlogHandler_test.go +++ b/handlers/adminBlogHandler_test.go @@ -6,6 +6,7 @@ import ( "log" "net/http" "net/http/httptest" + "strings" "testing" lg "github.com/GolangToolKits/go-level-logger" @@ -195,6 +196,188 @@ func TestMCHandler_GetAdminBlogList(t *testing.T) { } } +func TestMCHandler_SearchAdminBlogList(t *testing.T) { + var cf gss.ConfigOptions + cf.MaxAge = 3600 + cf.Path = "/" + sessionManager, err := gss.NewSessionManager("dsdfsadfs61dsscfsdfdsdsfsdsdllsd", cf) + if err != nil { + fmt.Println(err) + log.Println("Session err: ", err) + } + + r, _ := http.NewRequest("POST", "/searchBlog", strings.NewReader("name=test")) + r.Header.Set("Content-Type", "application/x-www-form-urlencoded; param=value") + w := httptest.NewRecorder() + + r2, _ := http.NewRequest("GET", "/", nil) + w2 := httptest.NewRecorder() + + ses := sessionManager.NewSession(r, "go-micro-blog-ui") + ses.Set("loggedIn", true) + ses.Set("userEmail", "bob@bob.com") + ses.Set("isAdmin", true) + ses.Save(w) + + cook := w.Result().Cookies() + if len(cook) > 0 { + r.AddCookie(cook[0]) + } + + ses2 := sessionManager.NewSession(r2, "go-micro-blog-ui") + ses2.Set("loggedIn", false) + ses2.Save(w2) + + cook2 := w2.Result().Cookies() + if len(cook2) > 0 { + r2.AddCookie(cook2[0]) + } + + var l lg.Logger + log := l.New() + log.SetLogLevel(lg.AllLevel) + + var mcdel mcd.MockDelegate + var b1 mcd.Blog + b1.Active = true + b1.Content = "dGVzdCAx" + b1.Name = "test 1" + b1.UserID = 21 + + var b2 mcd.Blog + b2.Active = true + b2.Content = "dGVzdCAy" + b2.Name = "test 2" + b2.UserID = 22 + + var b3 mcd.Blog + b3.Active = true + b3.Content = "dGVzdCAz" + b3.Name = "test 3" + b3.UserID = 23 + + var blo []mcd.Blog + blo = append(blo, b1) + blo = append(blo, b2) + blo = append(blo, b3) + mcdel.MockBlogList = &blo + + var c1 mcd.Comment + c1.Active = true + c1.BlogID = 1 + c1.Text = "test c 1" + c1.UserID = 11 + + var c2 mcd.Comment + c2.Active = true + c2.BlogID = 2 + c2.Text = "test c 2" + c2.UserID = 22 + var cml []mcd.Comment + cml = append(cml, c1) + cml = append(cml, c2) + mcdel.MockCommentList = &cml + + var l1 mcd.Like + l1.BlogID = 44 + l1.UserID = 22 + + var l2 mcd.Like + l2.BlogID = 44 + l2.UserID = 23 + var lkl []mcd.Like + lkl = append(lkl, l1) + lkl = append(lkl, l2) + mcdel.MockLikeList = &lkl + + //mcdel.GetUserActive = true + //mcdel.GetUserEmail = "test@test.com" + + var mus mcd.User + mus.Active = true + mus.Email = "bob@bob.com" + mcdel.MockUser = &mus + + type fields struct { + Log lg.Log + APIKey string + APIAdminKey string + Delegate mcd.Delegate + Signins map[string]s.Signin + SessionManager gss.SessionManager + AdminTemplates *template.Template + Templates *template.Template + SiteName string + Title string + Desc string + KeyWords string + SiteURL string + } + type args struct { + w http.ResponseWriter + r *http.Request + } + tests := []struct { + name string + fields fields + args args + resCode int + w *httptest.ResponseRecorder + }{ + // TODO: Add test cases. + { + name: "test 1", + fields: fields{ + Log: log, + Delegate: &mcdel, + SessionManager: sessionManager, + AdminTemplates: template.Must(template.ParseFiles("testHtmls/test.html")), + }, + args: args{ + w: w, + r: r, + }, + resCode: 200, + w: w, + }, + { + name: "test 2", + fields: fields{ + Log: log, + Delegate: &mcdel, + SessionManager: sessionManager, + AdminTemplates: template.Must(template.ParseFiles("testHtmls/test.html")), + }, + args: args{ + w: w2, + r: r2, + }, + resCode: 302, + w: w2, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + h := &MCHandler{ + Log: tt.fields.Log, + APIKey: tt.fields.APIKey, + APIAdminKey: tt.fields.APIAdminKey, + Delegate: tt.fields.Delegate, + Signins: tt.fields.Signins, + SessionManager: tt.fields.SessionManager, + AdminTemplates: tt.fields.AdminTemplates, + Templates: tt.fields.Templates, + SiteName: tt.fields.SiteName, + Title: tt.fields.Title, + Desc: tt.fields.Desc, + KeyWords: tt.fields.KeyWords, + SiteURL: tt.fields.SiteURL, + } + h.SearchAdminBlogList(tt.args.w, tt.args.r) + }) + } +} + func TestMCHandler_ActivateBlog(t *testing.T) { var cf gss.ConfigOptions diff --git a/handlers/blogHandler.go b/handlers/blogHandler.go index e6205cb..0632a09 100644 --- a/handlers/blogHandler.go +++ b/handlers/blogHandler.go @@ -394,29 +394,6 @@ func (h *MCHandler) UpdateBlog(w http.ResponseWriter, r *http.Request) { } } -func (h *MCHandler) processBlog(r *http.Request) (string, *mcd.Blog) { - var rtn mcd.Blog - idStr := r.FormValue("id") - uidStr := r.FormValue("userId") - name := r.FormValue("name") - email := r.FormValue("userEmail") - content := r.FormValue("content") - h.Log.Debug("name in processBlog: ", r.FormValue("name")) - if idStr != "" { - id, _ := strconv.ParseInt(idStr, 10, 64) - rtn.ID = id - } - if uidStr != "" { - uid, _ := strconv.ParseInt(uidStr, 10, 64) - rtn.UserID = uid - } - rtn.Content = b64.StdEncoding.EncodeToString([]byte(content)) - rtn.Name = name - rtn.Entered = time.Now() - - return email, &rtn -} - // SearchBlogList SearchBlogList func (h *MCHandler) SearchBlogList(w http.ResponseWriter, r *http.Request) { fmt.Println("in SearchBlogList") @@ -504,3 +481,26 @@ func (h *MCHandler) SearchBlogList(w http.ResponseWriter, r *http.Request) { } } } + +func (h *MCHandler) processBlog(r *http.Request) (string, *mcd.Blog) { + var rtn mcd.Blog + idStr := r.FormValue("id") + uidStr := r.FormValue("userId") + name := r.FormValue("name") + email := r.FormValue("userEmail") + content := r.FormValue("content") + h.Log.Debug("name in processBlog: ", r.FormValue("name")) + if idStr != "" { + id, _ := strconv.ParseInt(idStr, 10, 64) + rtn.ID = id + } + if uidStr != "" { + uid, _ := strconv.ParseInt(uidStr, 10, 64) + rtn.UserID = uid + } + rtn.Content = b64.StdEncoding.EncodeToString([]byte(content)) + rtn.Name = name + rtn.Entered = time.Now() + + return email, &rtn +} diff --git a/handlers/handler.go b/handlers/handler.go index 898ad37..8dfb8f6 100644 --- a/handlers/handler.go +++ b/handlers/handler.go @@ -38,6 +38,8 @@ const ( adminBannedUserPage = "adminBannedUser.html" adminConfigPage = "adminConfig.html" + adminAddRulePage = "adminAddRule.html" + //routes indexRt = "/" loginRt = "/login" @@ -78,6 +80,7 @@ type Handler interface { // GetUserAuthList(w http.ResponseWriter, r *http.Request) GetAdminBlogList(w http.ResponseWriter, r *http.Request) + SearchAdminBlogList(w http.ResponseWriter, r *http.Request) ActivateBlog(w http.ResponseWriter, r *http.Request) DeactivateBlog(w http.ResponseWriter, r *http.Request) DeleteBlog(w http.ResponseWriter, r *http.Request) diff --git a/handlers/rulesHandler.go b/handlers/rulesHandler.go index bf6f7bc..351dbd0 100644 --- a/handlers/rulesHandler.go +++ b/handlers/rulesHandler.go @@ -1,6 +1,14 @@ package handlers -import "net/http" +import ( + b64 "encoding/base64" + "fmt" + "html/template" + "net/http" + "strings" + + mcd "github.com/Ulbora/go-micro-blog-ui/delegates" +) /* Copyright (C) 2023 Ulbora Labs LLC. (www.ulboralabs.com) @@ -19,9 +27,73 @@ import "net/http" along with this program. If not, see . */ +// Rule Rule +type Rule struct { + Rule *mcd.Rule + TextHTML template.HTML + // User *mcd.User + // UserImage string + // CommentCnt int + // CommentList *[]Comment + // LikeCnt int + // Liked bool +} + +// RulePage RulePage +type RulePage struct { + Title string + Desc string + KeyWords string + Rule *Rule + Blog *Blog + IsAdmin bool + SiteData *SiteData +} + // SetRulesPage SetRulesPage func (h *MCHandler) SetRulesPage(w http.ResponseWriter, r *http.Request) { + fmt.Println("in SetRulesPage") + sr, suc := h.getSession(r) + h.Log.Debug("session suc", suc) + if suc { + loggedInAuth := sr.Get("loggedIn") + var isAdmin = sr.Get("isAdmin") + h.Log.Debug("loggedIn in AddBlog: ", loggedInAuth) + if loggedInAuth == true && isAdmin == true { + h.Log.Debug("template: ", h.Templates) + rule := h.Delegate.GetRule() + + var upg RulePage + upg.Title = h.Title + upg.Desc = h.Desc + upg.KeyWords = h.KeyWords + + var rl Rule + rl.Rule = rule + + h.Log.Debug("Content: ", rule.Content) + // upg.Rule = &rl + // uemail := sr.Get("userEmail") + // if uemail != nil { + // pd.UserEmail = uemail.(string) + // } + txt, err := b64.StdEncoding.DecodeString(rule.Content) + if err == nil { + rule.Content = string(txt) + rule.Content = strings.Replace(rule.Content, stripOut, "", -1) + rule.Content = strings.Replace(rule.Content, stripOut2, "", -1) + rule.Content = strings.Replace(rule.Content, stripOut3, "", -1) + rule.Content = strings.Replace(rule.Content, stripOut4, "", -1) + rl.TextHTML = template.HTML(rule.Content) + h.Log.Debug("TextHTML: ", rl.TextHTML) + } + upg.Rule = &rl + h.AdminTemplates.ExecuteTemplate(w, adminAddRulePage, &upg) + } else { + http.Redirect(w, r, indexRt, http.StatusFound) + } + } } // GetRules GetRules diff --git a/handlers/rulesHandler_test.go b/handlers/rulesHandler_test.go new file mode 100644 index 0000000..716c01a --- /dev/null +++ b/handlers/rulesHandler_test.go @@ -0,0 +1,156 @@ +package handlers + +import ( + "fmt" + "html/template" + "log" + "net/http" + "net/http/httptest" + "testing" + + lg "github.com/GolangToolKits/go-level-logger" + gss "github.com/GolangToolKits/go-secure-sessions" + mux "github.com/GolangToolKits/grrt" + mcd "github.com/Ulbora/go-micro-blog-ui/delegates" + s "github.com/Ulbora/go-micro-blog-ui/signins" +) + +func TestMCHandler_SetRulesPage(t *testing.T) { + + var cf gss.ConfigOptions + cf.MaxAge = 3600 + cf.Path = "/" + sessionManager, err := gss.NewSessionManager("dsdfsadfs61dsscfsdfdsdsfsdsdllsd", cf) + if err != nil { + fmt.Println(err) + log.Println("Session err: ", err) + } + + var l lg.Logger + log := l.New() + log.SetLogLevel(lg.AllLevel) + + r, _ := http.NewRequest("GET", "/", nil) + vars := map[string]string{ + "uid": "5", + } + r = mux.SetURLVars(r, vars) + w := httptest.NewRecorder() + + ses := sessionManager.NewSession(r, "go-micro-blog-ui") + ses.Set("loggedIn", true) + ses.Set("isAdmin", true) + ses.Set("userEmail", "bob@bob.com") + ses.Save(w) + + cook := w.Result().Cookies() + if len(cook) > 0 { + r.AddCookie(cook[0]) + } + + + r2, _ := http.NewRequest("GET", "/", nil) + + w2 := httptest.NewRecorder() + + ses2 := sessionManager.NewSession(r2, "go-micro-blog-ui") + ses2.Set("loggedIn", true) + ses2.Set("isAdmin", false) + ses2.Set("userEmail", "bob@bob.com") + ses2.Save(w2) + + cook2 := w2.Result().Cookies() + if len(cook2) > 0 { + r2.AddCookie(cook2[0]) + } + + var mcdel mcd.MockDelegate + var rl mcd.Rule + rl.ID = 2 + rl.Content = "test" + mcdel.MockRule = &rl + + + + type fields struct { + Log lg.Log + APIKey string + APIAdminKey string + Delegate mcd.Delegate + Signins map[string]s.Signin + SessionManager gss.SessionManager + AdminTemplates *template.Template + Templates *template.Template + SiteName string + Title string + Desc string + KeyWords string + SiteURL string + } + type args struct { + w http.ResponseWriter + r *http.Request + } + tests := []struct { + name string + fields fields + args args + resCode int + w *httptest.ResponseRecorder + }{ + // TODO: Add test cases. + { + name: "test 1", + fields: fields{ + Log: log, + Delegate: &mcdel, + SessionManager: sessionManager, + AdminTemplates: template.Must(template.ParseFiles("testHtmls/test.html")), + }, + args: args{ + w: w, + r: r, + }, + resCode: 200, + w: w, + }, + { + name: "test 2", + fields: fields{ + Log: log, + Delegate: &mcdel, + SessionManager: sessionManager, + AdminTemplates: template.Must(template.ParseFiles("testHtmls/test.html")), + }, + args: args{ + w: w2, + r: r2, + }, + resCode: 302, + w: w2, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + h := &MCHandler{ + Log: tt.fields.Log, + APIKey: tt.fields.APIKey, + APIAdminKey: tt.fields.APIAdminKey, + Delegate: tt.fields.Delegate, + Signins: tt.fields.Signins, + SessionManager: tt.fields.SessionManager, + AdminTemplates: tt.fields.AdminTemplates, + Templates: tt.fields.Templates, + SiteName: tt.fields.SiteName, + Title: tt.fields.Title, + Desc: tt.fields.Desc, + KeyWords: tt.fields.KeyWords, + SiteURL: tt.fields.SiteURL, + } + h.SetRulesPage(tt.args.w, tt.args.r) + if tt.resCode != tt.w.Code { + t.Fail() + } + }) + } +} diff --git a/main.go b/main.go index f5a409b..7f392ea 100644 --- a/main.go +++ b/main.go @@ -178,7 +178,8 @@ func main() { "./static/header.html", "./static/admin/adminBlogList.html", "./static/user-admin-nav.html", "./static/admin/adminBlog.html", "./static/admin/adminUser.html", "./static/admin/adminUnactivatedUser.html", - "./static/admin/adminBannedUser.html", "./static/admin/adminConfig.html")) + "./static/admin/adminBannedUser.html", "./static/admin/adminConfig.html", + "./static/admin/adminAddRule.html")) router := mux.NewRouter() @@ -208,6 +209,7 @@ func main() { router.HandleFunc("/searchPost", h.SearchBlogList).Methods("POST") router.HandleFunc("/adminPostList", h.GetAdminBlogList).Methods("GET") + router.HandleFunc("/searchAdminPost", h.SearchAdminBlogList).Methods("POST") router.HandleFunc("/activateBlog/{bid}", h.ActivateBlog).Methods("GET") router.HandleFunc("/deactivateBlog/{bid}", h.DeactivateBlog).Methods("GET") router.HandleFunc("/deleteBlog/{bid}", h.DeleteBlog).Methods("GET") @@ -223,6 +225,7 @@ func main() { router.HandleFunc("/reactivateUser/{uid}", h.ReinstateBannedUser).Methods("GET") router.HandleFunc("/adminConfig", h.GetConfig).Methods("GET") router.HandleFunc("/updateConfig", h.UpdateConfig).Methods("POST") + router.HandleFunc("/adminSetRules", h.SetRulesPage).Methods("GET") router.HandleFunc("/rs/loglevel", h.SetLogLevel).Methods("POST") router.PathPrefix("/").Handler(http.FileServer(http.Dir("./static/"))) diff --git a/static/admin/adminAddRule.html b/static/admin/adminAddRule.html new file mode 100644 index 0000000..50cec35 --- /dev/null +++ b/static/admin/adminAddRule.html @@ -0,0 +1,50 @@ + + + {{template "header" .}} + {{template "user-admin-navbar" .}} + +
+

Add Rule

+
+ + +
+ + +
+ {{.Rule.TextHTML}} +
+
+ + +
+
+ + + diff --git a/static/admin/adminBlogList.html b/static/admin/adminBlogList.html index 9c580f3..0fab7d8 100644 --- a/static/admin/adminBlogList.html +++ b/static/admin/adminBlogList.html @@ -34,6 +34,7 @@

{{.Desc}}

{{.Blog.Name}}

+
{{.Blog.Entered.Format "Jan 2, 2006"}}
diff --git a/static/blogList.html b/static/blogList.html index bed895c..776b982 100644 --- a/static/blogList.html +++ b/static/blogList.html @@ -27,6 +27,7 @@

{{.Desc}}

{{.Blog.Name}}

+
{{.Blog.Entered.Format "Jan 2, 2006"}}
diff --git a/static/user-admin-nav.html b/static/user-admin-nav.html index ed9b9ef..0cd95ff 100644 --- a/static/user-admin-nav.html +++ b/static/user-admin-nav.html @@ -30,7 +30,47 @@ + +