version v1.4.1 code update

This commit is contained in:
piccotalent216-hash
2026-08-29 18:08:42 +05:30
parent 82896cbdc2
commit 89208d9588
412 changed files with 76805 additions and 9297 deletions
+13 -4
View File
@@ -98,12 +98,21 @@ GRAPHQL_API_URL = 'http://localhost:8084/query'
GRAPHQL_PORT = '8084'
Stripe_Secret_Key = ''
Access_Client = ''
Access_Secret = ''
# //Default Master EndpointURL//
MASTER_BLOCKS_ENDPOINTURL ="https://superadmin.spurtcms.com/defaultblocklist/"
MASTER_BLOCKS_ENDPOINTURL ="https://superadmin.spurtcms.app/defaultblocklist/"
MASTER_CTA_ENDPOINTURL ="https://superadmin.spurtcms.com/defaultctalist/"
MASTER_CTA_ENDPOINTURL ="https://superadmin.spurtcms.app/defaultctalist/"
MASTER_CHANNELS_ENDPOINTURL ="https://superadmin.spurtcms.com/admin/channels/"
MASTER_CHANNELS_ENDPOINTURL ="https://superadmin.spurtcms.app/admin/channels/"
MASTER_INTEGRATION_ENDPOINTURL ="https://superadmin.spurtcms.com/integration/"
MASTER_INTEGRATION_ENDPOINTURL ="https://superadmin.spurtcms.app/integration/"
WEBSITE_DATA_ID = "1"
-3
View File
@@ -1,3 +0,0 @@
{
"liveServer.settings.port": 5501
}
+1 -1
View File
@@ -47,7 +47,7 @@ spurtCMS Admin Panel prioritizes user-friendly administration, offering powerful
This is the official repository of Spurtcms.You can easily deploy spurtcms in your local server.
### Step 1: Download the source files:
Username
Clone the Git repository that contains spurtCMS Admin project files, and .env file from the path https://github.com/spurtcms/spurtcms using the “git clone” command.
```
+12
View File
@@ -0,0 +1,12 @@
{
"Blogmaster": {
"Topic": "Topic",
"Kewords": "Kewords"
},
"Blogchild": {
"Title": "Title",
"Keword": "Kewords",
"Articlelength": "Article length",
"Tone": "Tone"
}
}
+36 -8
View File
@@ -163,19 +163,36 @@ INSERT INTO tbl_modules(id, module_name, is_active, created_by, created_on, defa
-- INSERT INTO tbl_modules(id, module_name, is_active, created_by, created_on, default_module, parent_id, assign_permission, icon_path, description, order_index, menu_type,full_access_permission,group_flg) VALUES(48, 'Courses', 1, 1, 'current_time', 0, 47, 0, '/public/img/Course black.svg', '', 47, 'tab',1,0)
INSERT INTO tbl_modules(id, module_name, is_active, created_by, created_on, default_module, parent_id, assign_permission, icon_path, description, order_index, menu_type,full_access_permission,group_flg) VALUES(49, 'Integration', 1, 1, 'current_time', 0, 0, 0, '/public/img/integration.svg', '', 48, 'left',1,0)
INSERT INTO tbl_modules(id, module_name, is_active, created_by, created_on, default_module, parent_id, assign_permission, icon_path, description, order_index, menu_type,full_access_permission,group_flg) VALUES(49, 'Integration', 1, 1, 'current_time', 0, 0, 0, '/public/img/integration.svg', '', 62, 'left',1,0)
INSERT INTO tbl_modules(id, module_name, is_active, created_by, created_on, default_module, parent_id, assign_permission, icon_path, description, order_index, menu_type,full_access_permission,group_flg) VALUES(50, 'Integration', 1, 1, 'current_time', 0, 49, 0, '/public/img/integration.svg', '', 49, 'tab',1,0)
INSERT INTO tbl_modules(id, module_name, is_active, created_by, created_on, default_module, parent_id, assign_permission, icon_path, description, order_index, menu_type,full_access_permission,group_flg) VALUES(50, 'Integration', 1, 1, 'current_time', 0, 49, 0, '/public/img/integration.svg', '', 63, 'tab',1,0)
-- INSERT INTO tbl_modules(id, module_name, is_active, created_by, created_on, default_module, parent_id, assign_permission, icon_path, description, order_index, menu_type,full_access_permission,group_flg) VALUES(51, 'Listing', 1, 1, 'current_time', 0, 0, 0, '/public/img/Default Listing.svg', '', 50, 'left',1,0)
-- INSERT INTO tbl_modules(id, module_name, is_active, created_by, created_on, default_module, parent_id, assign_permission, icon_path, description, order_index, menu_type,full_access_permission,group_flg) VALUES(52, 'Listing', 1, 1, 'current_time', 0, 51, 0, '/public/img/Default Listing.svg', '', 51, 'tab',1,0)
INSERT INTO tbl_modules(id, module_name, is_active, created_by, created_on, default_module, parent_id, assign_permission, icon_path, description, order_index, menu_type,full_access_permission,group_flg) VALUES(53, 'Website', 1, 1, 'current_time', 0, 0, 0, '/public/img/Default state.svg', '', 52, 'left',1,0)
-- INSERT INTO tbl_modules(id, module_name, is_active, created_by, created_on, default_module, parent_id, assign_permission, icon_path, description, order_index, menu_type,full_access_permission,group_flg) VALUES(53, 'Website', 1, 1, 'current_time', 0, 0, 0, '/public/img/Default state.svg', '', 52, 'left',1,0)
INSERT INTO tbl_modules(id, module_name, is_active, created_by, created_on, default_module, parent_id, assign_permission, icon_path, description, order_index, menu_type,full_access_permission,group_flg) VALUES(54, 'Website', 1, 1, 'current_time', 0, 53, 0, '/public/img/Default state.svg', '', 53, 'tab',1,0)
-- INSERT INTO tbl_modules(id, module_name, is_active, created_by, created_on, default_module, parent_id, assign_permission, icon_path, description, order_index, menu_type,full_access_permission,group_flg) VALUES(54, 'Website', 1, 1, 'current_time', 0, 53, 0, '/public/img/Default state.svg', '', 53, 'tab',1,0)
UPDATE tbl_modules set module_name='Website' WHERE id IN (53,54)
INSERT INTO tbl_modules(id, module_name, is_active, created_by, created_on, default_module, parent_id, assign_permission, icon_path, description, order_index, menu_type,full_access_permission,group_flg) VALUES(55, 'Browse theme', 1, 1, '2023-03-14 11:09:12', 0, 0, 0, '/public/img/group.svg', 'Create groups and categorize members into various groups like Elite Members or Favorite Members', 55, 'left',0,0);
INSERT INTO tbl_modules(id, module_name, is_active, created_by, created_on, default_module, parent_id, assign_permission, icon_path, description, order_index, menu_type,full_access_permission,group_flg) VALUES(56, 'Browse theme', 1, 1, '2023-03-14 11:09:12', 0, 55, 0, '/public/img/Default state.svg', '', 56, 'tab',1,0)
INSERT INTO tbl_modules(id, module_name, is_active, created_by, created_on, default_module, parent_id, assign_permission, icon_path, description, order_index, menu_type,full_access_permission,group_flg) VALUES(57, 'Pages', 1, 1, '2026-03-30 12:13:12', 0, 0, 0, '/public/img/pages-theme.svg', 'New Pages Menu integration', 57, 'left',1,0);
INSERT INTO tbl_modules(id, module_name, is_active, created_by, created_on, default_module, parent_id, assign_permission, icon_path, description, order_index, menu_type,full_access_permission,group_flg) VALUES(58, 'Pages', 1, 1, '2026-03-30 12:13:12', 0, 57, 0, '/public/img/pages-theme.svg', 'New Pages Menu integration', 59, 'tab',1,0);
INSERT INTO tbl_modules(id, module_name, is_active, created_by, created_on, default_module, parent_id, assign_permission, icon_path, description, order_index, menu_type,full_access_permission,group_flg) VALUES(59, 'SEO', 1, 1, '2026-03-30 12:13:12', 0, 0, 0, '/public/img/seo-theme.svg', 'New SEO Menu integration', 62, 'left',1,0);
INSERT INTO tbl_modules(id, module_name, is_active, created_by, created_on, default_module, parent_id, assign_permission, icon_path, description, order_index, menu_type,full_access_permission,group_flg) VALUES(60, 'SEO', 1, 1, '2026-03-30 12:13:12', 0, 59, 0, '/public/img/menu-theme.svg', 'New SEO Menu integration', 63, 'tab',1,0);
INSERT INTO tbl_modules(id, module_name, is_active, created_by, created_on, default_module, parent_id, assign_permission, icon_path, description, order_index, menu_type,full_access_permission,group_flg) VALUES(61, 'Menu', 1, 1, '2026-03-30 12:13:12', 0, 0, 0, '/public/img/seo-theme.svg', 'New Menu integration', 60, 'left',1,0);
INSERT INTO tbl_modules(id, module_name, is_active, created_by, created_on, default_module, parent_id, assign_permission, icon_path, description, order_index, menu_type,full_access_permission,group_flg) VALUES(62, 'Menu', 1, 1, '2026-03-30 12:13:12', 0, 61, 0, '/public/img/menu-theme.svg', 'New Menu integration', 61, 'tab',1,0);
-- UPDATE tbl_modules set module_name='Website' WHERE id IN (53,54)
--Default Module Permission Routes
INSERT INTO tbl_module_permissions(id, route_name, display_name, description, module_id, created_by, created_on, full_access_permission, parent_id, assign_permission,order_index, slug_name) VALUES (1, '/dashboard', 'Dashboard', '', 23, 1, 'current_time', 1, 0, 1, 1, 'dashboard')
@@ -242,7 +259,7 @@ INSERT INTO tbl_module_permissions(id, route_name, display_name, description, mo
INSERT INTO tbl_module_permissions(id, route_name, display_name, description, module_id, created_by, created_on, full_access_permission, parent_id, assign_permission,order_index, slug_name) VALUES(35, '/templates', 'Template', 'Give full access to the template', 36, 1, 'current_time', 1, 0, 1, 2, 'template')
INSERT INTO tbl_module_permissions(id, route_name, display_name, description, module_id, created_by, created_on, full_access_permission, parent_id, assign_permission,order_index, slug_name) VALUES (36, '/blocks', 'Blocks', 'Give full access to the blocks', 34, 1, 'current_time', 1, 0, 1, 2, 'blocks')
-- INSERT INTO tbl_module_permissions(id, route_name, display_name, description, module_id, created_by, created_on, full_access_permission, parent_id, assign_permission,order_index, slug_name) VALUES (36, '/blocks', 'Blocks', 'Give full access to the blocks', 34, 1, 'current_time', 1, 0, 1, 2, 'blocks')
-- INSERT INTO tbl_module_permissions(id, route_name, display_name, description, module_id, created_by, created_on, full_access_permission, parent_id, assign_permission,order_index, slug_name) VALUES (37, '/graphql/playground', 'Graphql Playground', 'Give full access to the graphql playground', 31, 1, 'current_time', 1, 0, 1, 2, 'graphqlplayground')
@@ -260,10 +277,21 @@ INSERT INTO tbl_module_permissions(id,route_name, display_name, description, mod
INSERT INTO tbl_module_permissions(id,route_name, display_name, description, module_id, created_by, created_on, full_access_permission, parent_id, assign_permission,order_index, slug_name) VALUES (44,'/integration', 'Integration', 'Give full access to the Integration', 50, 1, 'current_time', 1, 0, 1, 2, 'integration')
-- DELETE FROM tbl_module_permissions WHERE id = 45;
-- INSERT INTO tbl_module_permissions(id,route_name, display_name, description, module_id, created_by, created_on, full_access_permission, parent_id, assign_permission,order_index, slug_name) VALUES (45,'/listing', 'Listing', 'Give full access to the Listing', 52, 1, 'current_time', 1, 0, 1, 2, 'listing')
INSERT INTO tbl_module_permissions(id,route_name, display_name, description, module_id, created_by, created_on, full_access_permission, parent_id, assign_permission,order_index, slug_name) VALUES (46,'/website', 'Website', 'Give full access to the Content Website', 54, 1, 'current_time', 1, 0, 1, 2, 'website')
-- INSERT INTO tbl_module_permissions(id,route_name, display_name, description, module_id, created_by, created_on, full_access_permission, parent_id, assign_permission,order_index, slug_name) VALUES (46,'/website', 'Website', 'Give full access to the Content Website', 54, 1, 'current_time', 1, 0, 1, 2, 'website')
INSERT INTO tbl_module_permissions(id,route_name, display_name, description, module_id, created_by, created_on, full_access_permission, parent_id, assign_permission,order_index, slug_name) VALUES (47,'/browsetheme', 'Browse theme', 'Give full access to the Content Website', 56, 1, '2023-03-14 11:09:12', 1, 0, 1, 2, 'browsetheme')
INSERT INTO tbl_module_permissions(id, route_name, display_name, description, module_id, created_by, created_on, full_access_permission, parent_id, assign_permission,order_index, slug_name) VALUES (48, '/pages', 'View', 'Give view access to the Pages', 58, 1, '2023-03-14 11:09:12', 0, 0, 1, 1, 'view')
INSERT INTO tbl_module_permissions(id, route_name, display_name, description, module_id, created_by, created_on, full_access_permission, parent_id, assign_permission,order_index, slug_name) VALUES (49, '/seo', 'View', 'Give view access to the SEO', 60, 1, '2023-03-14 11:09:12', 0, 0, 1, 1, 'view')
INSERT INTO tbl_module_permissions(id, route_name, display_name, description, module_id, created_by, created_on, full_access_permission, parent_id, assign_permission,order_index, slug_name) VALUES (50, '/menu', 'View', 'Give view access to the Menu', 62, 1, '2023-03-14 11:09:12', 0, 0, 1, 1, 'view')
--default ai prompts
@@ -319,7 +347,7 @@ INSERT INTO tbl_countries (id, country_code, country_name) VALUES (1, 'AF', 'Afg
-- truncate table tbl_go_templates
INSERT INTO tbl_go_templates (id,template_name,template_image,is_deleted,channel_slug_name,template_module_name,created_on,template_description,tenant_id,created_by) VALUES (1,'Content Verse','/public/img/content_verse.jpeg',0,'blog','Blog','current_time','A content verse template is a structured outline that guides the arrangement and style of each section or verse within digital content, ensuring clarity and consistency.','1',1)
INSERT INTO tbl_go_templates (id,template_name,template_image,is_deleted,channel_slug_name,template_module_name,created_on,template_description,tenant_id,created_by) VALUES (1,'Content Verse','/websites/public/img/contentverse.jpg',0,'blog','Blog','current_time','A content verse template is a structured outline that guides the arrangement and style of each section or verse within digital content, ensuring clarity and consistency.','1',1)
-- truncate table tbl_websites
INSERT INTO tbl_websites(id,name,channel_names,template_id,tenant_id,is_deleted,created_by,created_on)values(1,'base_url','Blog',1,'1',0,1,'current_time')
+54
View File
@@ -0,0 +1,54 @@
package config
import (
"fmt"
"log"
"os"
"github.com/joho/godotenv"
"gorm.io/driver/mysql"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
func SetupDB() *gorm.DB {
er := godotenv.Load()
if er != nil {
log.Fatalf("Error loading .env file")
}
HOST := os.Getenv("DB_HOST")
PORT := os.Getenv("DB_PORT")
USERNAME := os.Getenv("DB_USERNAME")
PASSWORD := os.Getenv("DB_PASSWORD")
DBNAME := os.Getenv("DB_NAME")
var (
db *gorm.DB
err error
)
DataBaseType := os.Getenv("DATABASE_TYPE")
switch DataBaseType {
case "postgres":
dbUri := fmt.Sprintf("host=%s user=%s dbname=%s sslmode=disable password=%s", os.Getenv("DB_HOST"), os.Getenv("DB_USERNAME"), os.Getenv("DB_NAME"), os.Getenv("DB_PASSWORD")) //Build connection string
db, err = gorm.Open(postgres.Open(dbUri), &gorm.Config{})
case "mysql":
dsn := USERNAME + ":" + PASSWORD + "@tcp(" + HOST + ":" + PORT + ")/" + DBNAME + "?charset=utf8mb4&parseTime=True&loc=UTC"
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
default:
return nil
}
if err != nil {
fmt.Println(err)
}
return db
}
+720
View File
@@ -0,0 +1,720 @@
package controllers
import (
"context"
"encoding/json"
"fmt"
"os"
"spurt-cms/models"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
"github.com/sashabaranov/go-openai"
"github.com/spurtcms/auth"
"github.com/spurtcms/blocks"
chn "github.com/spurtcms/channels"
csrf "github.com/utrack/gin-csrf"
)
func Aicontents(c *gin.Context) {
channelid := c.Query("id")
ChannelId, _ := strconv.Atoi(channelid)
ChannelList, _, _ := ChannelConfig.GetChannelsById(ChannelId, TenantId)
keyword := strings.TrimSpace(c.Request.URL.Query().Get("keyword"))
menu := NewMenuController(c)
ModuleName, TabName, _ := ModuleRouteName(c)
translate, _ := TranslateHandler(c)
myapps, _, _ := models.GetAppList(keyword, TenantId)
var filterflag bool
if keyword != "" {
filterflag = true
} else {
filterflag = false
}
var applist []models.TblApps
for _, app := range myapps {
fields, _ := readJSONFile(app.FieldJsonPath)
var data map[string]interface{}
json.Unmarshal(fields, &data)
app.CustomFields = data
applist = append(applist, app)
}
userid := c.GetInt("userid")
UserDetails, _ := models.GetArticleCount(userid, TenantId)
c.HTML(200, "ai-assistance.html", gin.H{"articlecount": UserDetails.ArticleCount, "Menu": menu, "csrf": csrf.GetToken(c), "ChanSlug": ChannelList.SlugName, "Searchtrue": filterflag, "translate": translate, "title": ModuleName, "linktitle": "AI assistance", "Tabmenu": TabName, "myapps": applist, "filter": keyword})
}
func Receivetopicdata(c *gin.Context) {
topicvalue := c.PostForm("topic")
var aiprompt models.TblAiPrompt
perr := models.GetAiPrompts(&aiprompt, 2)
systemPrompt := aiprompt.SystemPrompt
tmpl := aiprompt.UserPrompt
if perr != nil {
ErrorLog.Printf("get aiprompt error: %s", perr)
}
newString := strings.Replace(tmpl, "{topic}", topicvalue, 1)
list, _, _ := models.ListAiModule(0, 0, models.Filter{}, TenantId)
var ApiModule models.TblAiSettingsModule
for _, value := range list {
if value.IsActive == 1 {
ApiModule = value
}
}
var client *openai.Client
var Model string
if ApiModule.ApiKey != "" {
client = openai.NewClient(ApiModule.ApiKey)
Model = ApiModule.AiModel
fmt.Println("ApiModule1:")
} else {
client = openai.NewClient(os.Getenv("OPENAI_API_KEY"))
Model = "gpt-4o-mini"
}
messages := []openai.ChatCompletionMessage{
{
Role: openai.ChatMessageRoleSystem,
Content: systemPrompt,
},
{
Role: openai.ChatMessageRoleUser,
Content: newString,
},
}
// Create a context
ctx := context.Background()
// Call the Chat API
response, err := client.CreateChatCompletion(ctx, openai.ChatCompletionRequest{
Model: Model, // Specify the model to use
Messages: messages,
ResponseFormat: &openai.ChatCompletionResponseFormat{Type: "json_object"},
})
if err != nil {
fmt.Println("Error calling ChatCompletion: %v", err)
}
var data string
// Print the response
for _, choice := range response.Choices {
data = choice.Message.Content
fmt.Println("Response:", choice.Message.Content)
}
c.JSON(200, gin.H{"data": data})
}
func Generatetopics(c *gin.Context) {
keywordvalue := c.PostForm("keyword")
var aiprompt models.TblAiPrompt
perr := models.GetAiPrompts(&aiprompt, 3)
systemPrompt := aiprompt.SystemPrompt
tmpl := aiprompt.UserPrompt
if perr != nil {
ErrorLog.Printf("get aiprompt error: %s", perr)
}
newString := strings.Replace(tmpl, "{keyword}", keywordvalue, 1)
list, _, _ := models.ListAiModule(0, 0, models.Filter{}, TenantId)
var ApiModule models.TblAiSettingsModule
for _, value := range list {
if value.IsActive == 1 {
ApiModule = value
}
}
var client *openai.Client
var Model string
if ApiModule.ApiKey != "" {
client = openai.NewClient(ApiModule.ApiKey)
Model = ApiModule.AiModel
fmt.Println("ApiModule2:")
} else {
client = openai.NewClient(os.Getenv("OPENAI_API_KEY"))
Model = "gpt-4o-mini"
}
messages := []openai.ChatCompletionMessage{
{
Role: openai.ChatMessageRoleSystem,
Content: systemPrompt,
},
{
Role: openai.ChatMessageRoleUser,
Content: newString,
},
}
// Create a context
ctx := context.Background()
// Call the Chat API
response, err := client.CreateChatCompletion(ctx, openai.ChatCompletionRequest{
Model: Model, // Specify the model to use
Messages: messages,
ResponseFormat: &openai.ChatCompletionResponseFormat{Type: "json_object"},
})
if err != nil {
fmt.Println("Error calling ChatCompletion: %v", err)
}
// Print the response
var data string
for _, choice := range response.Choices {
data = choice.Message.Content
}
c.JSON(200, gin.H{"data": data})
}
func Generatearticle(c *gin.Context) {
chnid := c.PostForm("chnid")
topic := c.PostForm("titletopic")
keywordvalue := c.PostForm("keywords")
articallenth := c.PostForm("articallenth")
tonetype := c.PostForm("tonetype")
var aiprompt models.TblAiPrompt
perrs := models.GetAiPrompts(&aiprompt, 1)
systemPrompt := aiprompt.SystemPrompt
tmpl := aiprompt.UserPrompt
if perrs != nil {
ErrorLog.Printf("get aiprompt error: %s", perrs)
}
tmpl = strings.Replace(tmpl, "{topic}", topic, 1)
tmpl = strings.Replace(tmpl, "{keywords}", keywordvalue, 1)
tmpl = strings.Replace(tmpl, "{articleLength}", articallenth, 1)
tmpl = strings.Replace(tmpl, "{tone}", tonetype, 2)
fmt.Println("end prompt", tmpl)
list, _, _ := models.ListAiModule(0, 0, models.Filter{}, TenantId)
var ApiModule models.TblAiSettingsModule
for _, value := range list {
if value.IsActive == 1 {
ApiModule = value
}
}
var client *openai.Client
var Model string
if ApiModule.ApiKey != "" {
client = openai.NewClient(ApiModule.ApiKey)
Model = ApiModule.AiModel
fmt.Println("ApiModule3:")
} else {
client = openai.NewClient(os.Getenv("OPENAI_API_KEY"))
Model = "gpt-4o-mini"
userid := c.GetInt("userid")
models.ArticleCountUpdate(userid, TenantId)
}
messages := []openai.ChatCompletionMessage{
{
Role: openai.ChatMessageRoleSystem,
Content: systemPrompt,
},
{
Role: openai.ChatMessageRoleUser,
Content: tmpl,
},
}
// Create a context
ctx := context.Background()
// Call the Chat API
response, err := client.CreateChatCompletion(ctx, openai.ChatCompletionRequest{
Model: Model, // Specify the model to use
Messages: messages,
})
if err != nil {
fmt.Println("Error calling ChatCompletion: %v", err)
}
// Print the response
var htmldata string
for _, choice := range response.Choices {
htmldata = choice.Message.Content
htmldata = strings.Replace(htmldata, "```html", "", 1)
htmldata = strings.Replace(htmldata, "```", "", 1)
fmt.Println("Response:", htmldata)
}
id, _ := strconv.Atoi(c.Param("id"))
// flag := true
_, perr := NewAuth.IsGranted("Entries", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("create Entry authorization error: %s", perr)
}
// if permisison {
channelist, clerr := ChannelConfig.GetPermissionChannel(TenantId)
if clerr != nil {
ErrorLog.Printf("create Entry listchannel error: %s", clerr)
}
_, entrcount, _, cherr := ChannelConfig.ChannelEntriesList(chn.Entries{ChannelId: id, Limit: 0, Offset: 0}, TenantId)
if cherr != nil {
ErrorLog.Printf("createEntry entrylist error: %s", cherr)
}
_, FinalSelectedCategories, cerr := ChannelConfig.GetChannelsById(id, TenantId)
if cerr != nil {
ErrorLog.Printf("createEntry channel data error: %s", cerr)
}
var idstr []string
for _, val := range FinalSelectedCategories {
var str string
for index, cat := range val.Categories {
if index+1 != len(val.Categories) {
str += strconv.Itoa(cat.Id) + ","
} else {
str += strconv.Itoa(cat.Id)
}
}
idstr = append(idstr, str)
}
field, err := ChannelConfig.GetAllMasterFieldType(TenantId)
if err != nil {
ErrorLog.Printf("createEntry get master fields error: %s", perr)
}
currentTime := time.Now()
cdate := currentTime.Format("2006-01-02T15:04")
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
// Folder, File, Media, NextCont, merr := GetMedia()
// if merr != nil {
// ErrorLog.Printf("createEntry media error: %s", perr)
// }
var (
filter blocks.Filter
collectionlist []blocks.TblBlock
)
filter.Keyword = strings.Trim(c.DefaultQuery("keyword", ""), " ")
permisison, perr := NewAuth.IsGranted("Blocks", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("block collection list authorization error: %s", perr)
}
if perr != nil {
ErrorLog.Printf("block authorization error: %s", perr)
c.Redirect(301, "/403-page")
return
}
var finalcollectionlist []blocks.TblBlock
if permisison {
BlockConfig.DataAccess = c.GetInt("dataaccess")
BlockConfig.UserId = c.GetInt("userid")
collectionlist, _, err = BlockConfig.CollectionList(blocks.Filter(filter), TenantId, "")
for _, value := range collectionlist {
img := value.CoverImage
imgcontain := "/image-resize?name="
flag := strings.Contains(img, imgcontain)
if !flag {
value.CoverImage = "/image-resize?name=" + value.CoverImage
}
finalcollectionlist = append(finalcollectionlist, value)
}
if err != nil {
fmt.Println("collection list", err)
}
}
selectedtype, _ := GetSelectedType()
data := map[string]interface{}{"data": finalcollectionlist}
bytedata, _ := json.Marshal(data)
baseurl := os.Getenv("BASE_URL")
urlpath := map[string]interface{}{"path": baseurl + "uploadb64image", "payload": "imagedata", "success": map[string]interface{}{"imagepath": "imagepath", "imagename": "imagename"}}
ubyte, _ := json.Marshal(urlpath)
ModuleName, _, _ := ModuleRouteName(c)
selectedchannel := channelist[len(channelist)-1]
slchannelid := selectedchannel.Id
// fmt.Println("chnid:", chnid)
ChannelId, _ := strconv.Atoi(chnid)
if err != nil {
fmt.Println(err)
}
c.HTML(200, "addentry.html", gin.H{"Menu": menu, "EntryId": ChannelId, "linktitle": "Create Entry", "title": ModuleName, "Fields": field, "translate": translate, "csrf": csrf.GetToken(c), "channellist": channelist, "CategoryName": FinalSelectedCategories, "entrycount": entrcount, "HeadTitle": translate.Channell.Channels, "Cmsmenu": true, "Entriestab": true, "currentdate": cdate, "StorageType": selectedtype.SelectedType, "blocks": string(bytedata), "Mode": "create", "Slchannelid": slchannelid, "Storagepath": string(ubyte), "htmldata": htmldata})
// c.Redirect(301,"/entries/create")
}
func Receiveproductdata(c *gin.Context) {
topicvalue := c.PostForm("product")
tmpl := `Looking for a reliable, high-quality product that can meet all your needs? {product} might just be the perfect choice. Designed to provide exceptional value and performance, {product} is gaining popularity for its innovative features and affordable price point. reply only with json: { topic: "topic",keywords:["keywords"],articleLength:"count of words"}`
newString := strings.Replace(tmpl, "{product}", topicvalue, 1)
list, _, _ := models.ListAiModule(0, 0, models.Filter{}, TenantId)
var ApiModule models.TblAiSettingsModule
for _, value := range list {
if value.IsActive == 1 {
ApiModule = value
}
}
var client *openai.Client
var Model string
if ApiModule.ApiKey != "" {
client = openai.NewClient(ApiModule.ApiKey)
Model = ApiModule.AiModel
fmt.Println("ApiModule4:")
} else {
client = openai.NewClient(os.Getenv("OPENAI_API_KEY"))
Model = "gpt-4o-mini"
}
messages := []openai.ChatCompletionMessage{
{
Role: openai.ChatMessageRoleSystem,
Content: "You are the best content creator for a common blog website",
},
{
Role: openai.ChatMessageRoleUser,
Content: newString,
},
}
// Create a context
ctx := context.Background()
// Call the Chat API
response, err := client.CreateChatCompletion(ctx, openai.ChatCompletionRequest{
Model: Model, // Specify the model to use
Messages: messages,
ResponseFormat: &openai.ChatCompletionResponseFormat{Type: "json_object"},
})
if err != nil {
fmt.Println("Error calling ChatCompletion: %v", err)
}
var data string
// Print the response
for _, choice := range response.Choices {
data = choice.Message.Content
// fmt.Println("Response:", choice.Message.Content)
}
c.JSON(200, gin.H{"data": data})
}
func GenerateEcommercearticle(c *gin.Context) {
topic := c.PostForm("titleproduct")
keywordvalue := c.PostForm("keyfeature")
articallenth := c.PostForm("descriptionlength")
tonetype := c.PostForm("ectonetype")
tmpl := `create a set of content for the ecommerce blog with the given product name: {topic} in {articleLength}. The article should be in the tone of {tone}. The article should be based on the keywords: "{keywords}", and you may consider those keywords as sub-concepts. Generate the article effectively and exactly in the {tone} tone. The output should be in the format of innerHTML with Tailwind CSS and the response doesn't contain any additional texts or notes`
tmpl = strings.Replace(tmpl, "{topic}", topic, 1)
tmpl = strings.Replace(tmpl, "{keywords}", keywordvalue, 1)
tmpl = strings.Replace(tmpl, "{articleLength}", articallenth, 1)
tmpl = strings.Replace(tmpl, "{tone}", tonetype, 2)
// fmt.Println("end prompt", tmpl)
list, _, _ := models.ListAiModule(0, 0, models.Filter{}, TenantId)
var ApiModule models.TblAiSettingsModule
for _, value := range list {
if value.IsActive == 1 {
ApiModule = value
}
}
var client *openai.Client
var Model string
if ApiModule.ApiKey != "" {
client = openai.NewClient(ApiModule.ApiKey)
Model = ApiModule.AiModel
fmt.Println("ApiModule5:")
} else {
client = openai.NewClient(os.Getenv("OPENAI_API_KEY"))
Model = "gpt-4o-mini"
}
messages := []openai.ChatCompletionMessage{
{
Role: openai.ChatMessageRoleSystem,
Content: "You are the best content creator for a common blog website",
},
{
Role: openai.ChatMessageRoleUser,
Content: tmpl,
},
}
// Create a context
ctx := context.Background()
// Call the Chat API
response, err := client.CreateChatCompletion(ctx, openai.ChatCompletionRequest{
Model: Model, // Specify the model to use
Messages: messages,
})
if err != nil {
fmt.Println("Error calling ChatCompletion: %v", err)
}
// Print the response
var htmldata string
for _, choice := range response.Choices {
htmldata = choice.Message.Content
htmldata = strings.Replace(htmldata, "```html", "", 1)
htmldata = strings.Replace(htmldata, "```", "", 1)
fmt.Println("Response:", htmldata)
}
id, _ := strconv.Atoi(c.Param("id"))
// flag := true
_, perr := NewAuth.IsGranted("Entries", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("create Entry authorization error: %s", perr)
}
// if permisison {
channelist, clerr := ChannelConfig.GetPermissionChannel(TenantId)
if clerr != nil {
ErrorLog.Printf("create Entry listchannel error: %s", clerr)
}
_, entrcount, _, cherr := ChannelConfig.ChannelEntriesList(chn.Entries{ChannelId: id, Limit: 0, Offset: 0}, TenantId)
if cherr != nil {
ErrorLog.Printf("createEntry entrylist error: %s", cherr)
}
_, FinalSelectedCategories, cerr := ChannelConfig.GetChannelsById(id, TenantId)
if cerr != nil {
ErrorLog.Printf("createEntry channel data error: %s", cerr)
}
var idstr []string
for _, val := range FinalSelectedCategories {
var str string
for index, cat := range val.Categories {
if index+1 != len(val.Categories) {
str += strconv.Itoa(cat.Id) + ","
} else {
str += strconv.Itoa(cat.Id)
}
}
idstr = append(idstr, str)
}
field, err := ChannelConfig.GetAllMasterFieldType(TenantId)
if err != nil {
ErrorLog.Printf("createEntry get master fields error: %s", perr)
}
currentTime := time.Now()
cdate := currentTime.Format("2006-01-02T15:04")
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
// Folder, File, Media, NextCont, merr := GetMedia()
// if merr != nil {
// ErrorLog.Printf("createEntry media error: %s", perr)
// }
var (
filter blocks.Filter
collectionlist []blocks.TblBlock
)
filter.Keyword = strings.Trim(c.DefaultQuery("keyword", ""), " ")
permisison, perr := NewAuth.IsGranted("Blocks", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("block collection list authorization error: %s", perr)
}
if perr != nil {
ErrorLog.Printf("block authorization error: %s", perr)
c.Redirect(301, "/403-page")
return
}
var finalcollectionlist []blocks.TblBlock
if permisison {
BlockConfig.DataAccess = c.GetInt("dataaccess")
BlockConfig.UserId = c.GetInt("userid")
collectionlist, _, err = BlockConfig.CollectionList(blocks.Filter(filter), TenantId, "")
for _, value := range collectionlist {
img := value.CoverImage
imgcontain := "/image-resize?name="
flag := strings.Contains(img, imgcontain)
if !flag {
value.CoverImage = "/image-resize?name=" + value.CoverImage
}
finalcollectionlist = append(finalcollectionlist, value)
}
if err != nil {
fmt.Println("collection list", err)
}
}
selectedtype, _ := GetSelectedType()
data := map[string]interface{}{"data": finalcollectionlist}
bytedata, _ := json.Marshal(data)
baseurl := os.Getenv("BASE_URL")
urlpath := map[string]interface{}{"path": baseurl + "uploadb64image", "payload": "imagedata", "success": map[string]interface{}{"imagepath": "imagepath", "imagename": "imagename"}}
ubyte, _ := json.Marshal(urlpath)
ModuleName, _, _ := ModuleRouteName(c)
selectedchannel := channelist[len(channelist)-1]
slchannelid := selectedchannel.Id
c.HTML(200, "addentry.html", gin.H{"Menu": menu, "linktitle": "Create Entry", "title": ModuleName, "Fields": field, "translate": translate, "csrf": csrf.GetToken(c), "channellist": channelist, "CategoryName": FinalSelectedCategories, "entrycount": entrcount, "HeadTitle": translate.Channell.Channels, "Cmsmenu": true, "Entriestab": true, "currentdate": cdate, "StorageType": selectedtype.SelectedType, "blocks": string(bytedata), "Mode": "create", "Slchannelid": slchannelid, "Storagepath": string(ubyte), "htmldata": htmldata})
return
// c.Redirect(301,"/entries/create")
}
func readJSONFile(filePath string) ([]byte, error) {
file, err := os.ReadFile(filePath)
if err != nil {
return file, fmt.Errorf("could not open file: %v", err)
}
return file, nil
}
+319
View File
@@ -0,0 +1,319 @@
package controllers
import (
"fmt"
"spurt-cms/models"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
"github.com/spurtcms/auth"
csrf "github.com/utrack/gin-csrf"
)
func AiSettings(c *gin.Context) {
var limt int
var offset int
var filter models.Filter
limit := c.Query("limit")
pageno, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
filter.Keyword = strings.Trim(c.DefaultQuery("keyword", ""), " ")
var searchflag bool
if filter.Keyword != "" {
searchflag = true
} else {
searchflag = false
}
if limit == "" {
limt = Limit
} else {
limt, _ = strconv.Atoi(limit)
}
if pageno != 0 {
offset = (pageno - 1) * limt
}
permisison, perr := NewAuth.IsGranted("AI Settings", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("AI Settings authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("AI Settings authorization error")
c.Redirect(301, "/403-page")
return
}
list, _, _ := models.ListAiModule(limt, offset, filter, TenantId)
_, count, err := models.ListAiModule(0, 0, filter, TenantId)
if err != nil {
fmt.Println(err)
}
var aimodulelist []models.TblAiSettingsModule
for _, val := range list {
if !val.ModifiedOn.IsZero() {
val.DateString = val.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
val.DateString = val.CreatedOn.In(TZONE).Format(Datelayout)
}
aimodulelist = append(aimodulelist, val)
}
//pagination calc
paginationendcount := len(aimodulelist) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(pageno, int(count), limt)
menu := NewMenuController(c)
translate, _ := TranslateHandler(c)
c.HTML(200, "ai-settings.html", gin.H{"Pagination": PaginationData{
NextPage: pageno + 1,
PreviousPage: pageno - 1,
TotalPages: PageCount,
TwoAfter: pageno + 2,
TwoBelow: pageno - 2,
ThreeAfter: pageno + 3,
}, "Menu": menu, "linktitle": "AI Module settings", "Searchtrue": searchflag, "title": "AI Module settings", "csrf": csrf.GetToken(c), "HeadTitle": "AI Module settings", "translate": translate, "SettingsHead": true, "list": aimodulelist, "Count": count, "Paginationendcount": paginationendcount, "Previous": Previous, "Next": Next, "PageCount": PageCount, "CurrentPage": pageno, "Page": Page, "Filter": filter, "Paginationstartcount": paginationstartcount, "Limit": limt})
}
func CreateAIApiKeySetting(c *gin.Context) {
aimodule := c.PostForm("aimodule")
apikey := c.PostForm("apikey")
desc := c.PostForm("desc")
aimodel := c.PostForm("apimodel")
userid := c.GetInt("userid")
createdon, _ := time.Parse("2006-01-02 15:04:05", time.Now().UTC().Format("2006-01-02 15:04:05"))
permisison, perr := NewAuth.IsGranted("AI Settings", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("AI Settings authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("AI Settings authorization error")
c.Redirect(301, "/403-page")
return
}
create := models.TblAiSettingsModule{
AIModule: aimodule,
ApiKey: apikey,
Description: desc,
AiModel: aimodel,
IsActive: 0,
CreatedOn: createdon,
CreatedBy: userid,
IsDeleted: 0,
TenantId: TenantId,
}
_, err := models.CreateAiModule(create)
if err != nil {
fmt.Println(err)
}
c.SetCookie("get-toast", "AI Module Created Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/aisettings/")
}
func StatusAction(c *gin.Context) {
userid := c.GetInt("userid")
id, _ := strconv.Atoi(c.PostForm("id"))
isactive, _ := strconv.Atoi(c.PostForm("isactive"))
permisison, perr := NewAuth.IsGranted("AI Settings", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("AI Settings authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("AI Settings authorization error")
c.Redirect(301, "/403-page")
return
}
value, err := models.StatusChange(id, isactive, userid, TenantId)
if err != nil {
fmt.Println(err)
}
c.JSON(200, gin.H{"value": value, "url": "/admin/settings/aisettings/"})
}
func UpdateAIApiKeySetting(c *gin.Context) {
id, _ := strconv.Atoi(c.PostForm("moduleid"))
aimodule := c.PostForm("aimodule")
apikey := c.PostForm("apikey")
desc := c.PostForm("desc")
aimodel := c.PostForm("apimodel")
userid := c.GetInt("userid")
modifiedon, _ := time.Parse("2006-01-02 15:04:05", time.Now().UTC().Format("2006-01-02 15:04:05"))
permisison, perr := NewAuth.IsGranted("AI Settings", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("AI Settings authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("AI Settings authorization error")
c.Redirect(301, "/403-page")
return
}
update := models.TblAiSettingsModule{
Id: id,
AIModule: aimodule,
ApiKey: apikey,
Description: desc,
AiModel: aimodel,
ModifiedBy: userid,
ModifiedOn: modifiedon,
TenantId: TenantId,
}
_, err := models.UpdateAiModule(update)
if err != nil {
fmt.Println(err)
}
c.SetCookie("get-toast", "AI Module Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/aisettings/")
}
func DeleteModule(c *gin.Context) {
id, _ := strconv.Atoi(c.Param("id"))
pageno := c.Query("page")
userid := c.GetInt("userid")
var url string
permisison, perr := NewAuth.IsGranted("AI Settings", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("AI Settings authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("AI Settings authorization error")
c.Redirect(301, "/403-page")
return
}
_, err := models.DeleteModule(id, userid, TenantId)
if err != nil {
fmt.Println(err)
}
_, count, _ := models.ListAiModule(0, 0, models.Filter{}, TenantId)
if pageno != "" {
page, _ := strconv.Atoi(pageno)
page = page - 1
multi := page * 10
multiInt64 := int64(multi)
if count > multiInt64 {
url = "/admin/settings/aisettings/?page=" + pageno
} else {
pagee, _ := strconv.Atoi(pageno)
_page := pagee - 1
pages := strconv.Itoa(_page)
url = "/admin/settings/aisettings/?page=" + pages
}
} else {
url = "/admin/settings/aisettings/"
}
c.SetCookie("get-toast", "AI Module Deleted Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, url)
}
func MultiselectDeleteModule(c *gin.Context) {
moduleids := c.PostFormArray("moduleids[]")
pageno := c.PostForm("page")
userid := c.GetInt("userid")
var url string
moduleIntIds := make([]int, len(moduleids))
for i, id := range moduleids {
intId, _ := strconv.Atoi(id)
moduleIntIds[i] = intId
}
permisison, perr := NewAuth.IsGranted("AI Settings", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("AI Settings authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("AI Settings authorization error")
c.Redirect(301, "/403-page")
return
}
value, err := models.MultiSelectDelete(moduleIntIds, userid, TenantId)
if err != nil {
fmt.Println(err)
}
_, count, _ := models.ListAiModule(0, 0, models.Filter{}, TenantId)
if pageno != "" {
page, _ := strconv.Atoi(pageno)
page = page - 1
multi := page * 10
multiInt64 := int64(multi)
if count > multiInt64 {
url = "/admin/settings/aisettings/?page=" + pageno
} else {
pagee, _ := strconv.Atoi(pageno)
_page := pagee - 1
pages := strconv.Itoa(_page)
url = "/admin/settings/aisettings/?page=" + pages
}
} else {
url = "/admin/settings/aisettings/"
}
c.JSON(200, gin.H{"value": value, "url": url})
}
+938
View File
@@ -0,0 +1,938 @@
package controllers
import (
"encoding/json"
"fmt"
"html/template"
"net/http"
"os"
"spurt-cms/logger"
"spurt-cms/models"
storagecontroller "spurt-cms/storage-controller"
"strconv"
"strings"
"sync"
"time"
"github.com/dgrijalva/jwt-go"
"github.com/gin-gonic/gin"
"github.com/gorilla/sessions"
mem "github.com/spurtcms/member"
csrf "github.com/utrack/gin-csrf"
"gorm.io/gorm"
)
var Store = sessions.NewCookieStore([]byte("!@#$%"))
var Store1 = sessions.NewCookieStore([]byte(os.Getenv("SESSION_KEY1")))
func init() {
ErrorLog = logger.ErrorLog()
WarnLog = logger.WarnLog()
// SetInitialGeneralValues()
}
/*login page view*/
func Login(c *gin.Context) {
session, _ := Store.Get(c.Request, os.Getenv("SESSION_KEY"))
tkn := session.Values["token"]
if tkn != "" && tkn != nil {
tkn := session.Values["token"].(string)
claims := jwt.MapClaims{}
token, err := jwt.ParseWithClaims(tkn, claims, func(token *jwt.Token) (interface{}, error) {
return []byte(os.Getenv("JWT_SECRET")), nil
})
if err != nil || !token.Valid {
c.Redirect(http.StatusFound, "/")
return
}
c.Writer.Header().Set("Pragma", "no-cache")
c.Redirect(301, "/admin/dashboard")
return
}
c.HTML(200, "login.html", gin.H{"csrf": csrf.GetToken(c)})
}
/*forgetpassword page view*/
func ForgetPassword(c *gin.Context) {
c.HTML(200, "forgotpassword.html", gin.H{"csrf": csrf.GetToken(c)})
}
func NewPassword(c *gin.Context) {
token := c.Query("token")
Claims := jwt.MapClaims{}
_, err := jwt.ParseWithClaims(token, Claims, func(token *jwt.Token) (interface{}, error) {
return []byte(os.Getenv("JWT_SECRET")), nil
})
if err != nil {
if err == jwt.ErrSignatureInvalid {
ErrorLog.Printf("Invalid token change password error: %s", err)
return
}
}
userid := Claims["user_id"]
c.HTML(200, "change_password.html", gin.H{"csrf": csrf.GetToken(c), "userid": userid})
}
func SendLinkForForgotPass(c *gin.Context) {
email := c.PostForm("emailid")
user, _, err := NewTeam.CheckEmail(email, 0, TenantId)
id := user.Id
token, _ := CreateTokenWithExpireTime(id)
if err != nil {
ErrorLog.Printf("Send Link forget password error: %s", err)
c.SetCookie("log-toast", "You are not registered with us", 3600, "", "", false, false)
c.Redirect(301, "/admin/forgot")
return
}
var url_prefix = os.Getenv("BASE_URL")
linkedin := os.Getenv("LINKEDIN")
facebook := os.Getenv("FACEBOOK")
twitter := os.Getenv("TWITTER")
youtube := os.Getenv("YOUTUBE")
insta := os.Getenv("INSTAGRAM")
data := map[string]interface{}{
"fname": user.Username,
"resetpassword": url_prefix + "admin/change-password?token=" + token,
"restpassurl": url_prefix + "admin/change-password",
"admin_logo": url_prefix + "public/img/SpurtCMSlogo.png",
"fb_logo": url_prefix + "public/img/email-icons/facebook.png",
"linkedin_logo": url_prefix + "public/img/email-icons/linkedin.png",
"twitter_logo": url_prefix + "public/img/email-icons/x.png",
"youtube_logo": url_prefix + "public/img/email-icons/youtube.png",
"insta_log": url_prefix + "public/img/email-icons/instagram.png",
"facebook": facebook,
"instagram": insta,
"youtube": youtube,
"linkedin": linkedin,
"twitter": twitter,
}
// fmt.Println(user.Username, "isernameee")
var wg sync.WaitGroup
wg.Add(1)
Chan := make(chan string, 1)
go ForgetPasswordEmail(Chan, &wg, data, email, "Forgot Password", "1")
close(Chan)
c.SetCookie("success", "Reset password email send successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/admin/forgot")
}
func SetNewPassword(c *gin.Context) {
newPassword := c.PostForm("pass")
confirmPassword := c.PostForm("cpass")
userid, _ := strconv.Atoi(c.PostForm("userId"))
if newPassword == confirmPassword {
_, err := NewTeamWP.ChangeYourPassword(newPassword, userid, TenantId)
if err != nil {
ErrorLog.Printf("set new password error: %s", err)
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
return
}
c.SetCookie("get-toast", "Password Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/admin")
}
}
/*checklogin*/
func CheckLogin(c *gin.Context) {
fmt.Println("checklogin")
//get values from html
uname := c.PostForm("username")
remember := c.PostForm("rememberme")
token, userid, err := NewAuth.Checklogin(uname, c.Request.PostFormValue("pass"), TenantId)
if err != nil {
ErrorLog.Printf("CheckLogin error: %s", err)
c.Redirect(301, "/admin")
// return
}
if err != nil && err.Error() == "user disabled please contact admin" {
c.SetCookie("log-toast", "This account is inactive please contact the admin", 3600, "", "", false, false)
c.Redirect(301, "/admin")
return
}
userdata, _, _ := NewTeam.GetUserById(userid, []int{})
if !userdata.LastLogin.IsZero() {
Lastactive := userdata.LastLogin.In(TZONE).Format(Datelayout)
Lastlogin[userdata.Id] = Lastactive
} else {
Lastlogin[userdata.Id] = "--"
}
if c.Request.PostFormValue("username") == "" || c.Request.PostFormValue("pass") == "" {
c.Redirect(301, "/admin")
return
}
if gorm.ErrRecordNotFound == err {
c.SetCookie("log-toast", "You are not registered with us", 3600, "", "", false, false)
c.Redirect(301, "/admin")
return
}
if strings.Contains(fmt.Sprint(err), "invalid password") {
c.SetCookie("username", uname, 3600, "", "", false, false)
c.SetCookie("pass-toast", "Invalid Password", 3600, "", "", false, false)
// c.Redirect(301, "/")
return
}
if remember == "1" {
Session1, _ := Store.Get(c.Request, "REMEMBER_ME")
Session1.Values["rememberme"] = remember
Session1.Save(c.Request, c.Writer)
}
Session, _ := Store.Get(c.Request, os.Getenv("SESSION_KEY"))
Session.Values["token"] = token
Session.Save(c.Request, c.Writer)
c.Redirect(301, "/admin/dashboard")
}
// logout and clear the sessions
func Logout(c *gin.Context) {
userid := c.GetInt("userid")
// models.LastLoginActivity(userid, TenantId)
NewTeamWP.LastLoginActivity(userid, TenantId)
session, err := Store.Get(c.Request, os.Getenv("SESSION_KEY"))
if err != nil {
ErrorLog.Printf("Logout session get error: %s", err)
}
session.Values["token"] = ""
session.Options.MaxAge = -1
er := session.Save(c.Request, c.Writer)
if er != nil {
ErrorLog.Printf("Logout session save error: %s", er)
}
c.Writer.Header().Set("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0")
c.Writer.Header().Set("Pragma", "no-cache")
c.Writer.Header().Set("Expires", "Thu, 01 Jan 1970 00:00:00 GMT") // date in the past ensures expiration
// cookieNames := []string{"myspurtcms", "lang", "channelbanner", "blockbanner", "tempbanner", "ctadesc", "ctabanner"}
// for _, name := range cookieNames {
// c.SetCookie(name, "", -1, "/", "spurtcms.com", false, false)
// c.SetCookie(name, "", -1, "/", ".lvh.me", false, false)
// }
c.Writer.Header().Set("Pragma", "no-cache")
for _, cookie := range c.Request.Cookies() {
c.SetCookie(cookie.Name, "", -1, "/", "", false, true)
}
c.Redirect(301, "/")
}
func LastActive(c *gin.Context) {
userid := c.GetInt("userid")
NewTeamWP.LastLoginActivity(userid, TenantId)
}
func CreateTokenWithExpireTime(userid int) (string, error) {
var err error
//Creating Access Token
atClaims := jwt.MapClaims{}
atClaims["authorized"] = true
atClaims["user_id"] = userid
atClaims["exp"] = time.Now().Add(time.Second * 300).Unix()
at := jwt.NewWithClaims(jwt.SigningMethodHS256, atClaims)
token, err := at.SignedString([]byte(os.Getenv("JWT_SECRET")))
if err != nil {
return "", err
}
return token, nil
}
func GetTemplateNamee(c *gin.Context, TemplateName string) string {
templateName := c.Query("template_name")
if templateName == "" {
templateName = TemplateName
}
templateName = strings.ReplaceAll(strings.ToLower(templateName), " ", "_")
return templateName
}
func MyProfiles(c *gin.Context) {
User, website, err := GetTenantByHost(c)
if err != nil {
fmt.Println(err)
}
newmenulist, err := MenuConfig.GetmenusByTenantId(website.Id, User.TenantId)
if err != nil {
fmt.Println(err)
}
UserDetailsFunction(c)
AllEntryList, _ := AllEntryList(User.TenantId, website.Id)
templatedetails, _ := MenuConfig.GetTemplateById(User.GoTemplateDefault, User.TenantId)
Template := GetTemplateNamee(c, templatedetails.TemplateName)
seodetail, err := MenuConfig.SeoDetail(User.TenantId, website.Id)
if err != nil {
fmt.Println(err)
}
settingsdetail, err := MenuConfig.SettingsDetail(User.TenantId, website.Id)
if err != nil {
fmt.Println(err)
}
tmpl, err := template.ParseFiles("websites/themes/"+Template+"/layouts/partials/header.html", "websites/themes/"+Template+"/layouts/partials/footer.html", "websites/themes/"+Template+"/layouts/partials/head.html", "websites/themes/"+Template+"/layouts/_default/my_profiles.html")
if err != nil {
fmt.Println(err, "templateerr")
}
memberid := c.GetInt("member_id")
profile, member_details, ProfileName := GetProfileName(c, User.TenantId)
var member models.TblMembers
member, err = models.GetMemberById(memberid, User.TenantId)
if err != nil {
fmt.Println(err)
}
PageHeading := "My Profile"
websitemenu, _ := c.Cookie("websitemenu")
if websitemenu == "" {
websitemenu = "false"
}
RenderTemplate(c, tmpl, "my_profiles.html", gin.H{"menulist": newmenulist, "searchlist": AllEntryList, "template_name": c.Query("template_name"), "seodetail": seodetail, "settingsdetail": settingsdetail, "member": member, "ProfileImagePath": member.ProfileImagePath, "profile": profile, "PageHeading": PageHeading, "websitemenu": websitemenu, "memberprofile": member_details, "profilename": ProfileName})
}
func UpdateprofileData(c *gin.Context) {
var MemberGroupId, _ = strconv.Atoi(c.PostForm("membergroupvalue"))
memberbid, _ := strconv.Atoi(c.PostForm("memberid"))
fmt.Println("mem grp id", MemberGroupId)
imagedata := c.PostForm("crop_data")
User, _, err := GetTenantByHost(c)
if err != nil {
fmt.Println(err)
}
var imageName, imagePath string
if imagedata != "" {
fmt.Println("checkprofileimagepath")
var (
imageByte []byte
err error
)
imageName, imagePath, imageByte, err = ConvertBase64toByte(imagedata, "member")
if err != nil {
ErrorLog.Printf("convert base 64 to byte error : %s", err)
}
imagePath = User.S3FolderName + imagePath
uerr := storagecontroller.UploadCropImageS3(imageName, imagePath, imageByte)
if uerr != nil {
c.SetCookie("Alert-msg", "ERRORAWScredentialsnotfound", 3600, "", "", false, false)
c.Redirect(301, "/")
return
}
}
Member := map[string]interface{}{
"first_name": c.PostForm("mem_fname"),
"username": c.PostForm("mem_name"),
"email": c.PostForm("mem_email"),
"mobile_no": c.PostForm("mem_mobile"),
"is_active": 1,
"storage_type": "aws",
}
removeImage := c.PostForm("remove_image")
if removeImage == "1" {
Member["profile_image"] = ""
Member["profile_image_path"] = ""
} else if imageName != "" && imagePath != "" {
Member["profile_image"] = imageName
Member["profile_image_path"] = imagePath
}
err = MemberConfigWP.MemberFlexibleUpdate(Member, memberbid, User.Id, User.TenantId)
if err != nil {
fmt.Println("update member error:", err)
}
c.Redirect(301, "/")
}
func SignUp(c *gin.Context) {
User, website, err := GetTenantByHost(c)
if err != nil {
fmt.Println(err)
}
newmenulist, err := GetMenuItemsListByTenantID(User.TenantId, website.Id)
if err != nil {
fmt.Println(err)
}
templatedetails, _ := MenuConfig.GetTemplateById(User.GoTemplateDefault, User.TenantId)
Template := GetTemplateNamee(c, templatedetails.TemplateName)
AllEntryList, _ := AllEntryList(User.TenantId, website.Id)
tmpl, err := template.ParseFiles("websites/themes/"+Template+"/layouts/partials/header.html", "websites/themes/"+Template+"/layouts/partials/footer.html", "websites/themes/"+Template+"/layouts/partials/head.html", "websites/common/layouts/signup.html")
if err != nil {
fmt.Println(err, "templateerr")
}
RenderTemplate(c, tmpl, "signup.html", gin.H{"menulist": newmenulist, "csrf": csrf.GetToken(c), "searchlist": AllEntryList, "template_name": c.Query("template_name"), "userid": User.Id})
}
func Signin(c *gin.Context) {
User, webisite, err := GetTenantByHost(c)
if err != nil {
fmt.Println(err)
}
newmenulist, err := GetMenuItemsListByTenantID(User.TenantId, webisite.Id)
if err != nil {
fmt.Println(err)
}
templatedetails, err := MenuConfig.GetTemplateById(User.GoTemplateDefault, User.TenantId)
Template := GetTemplateNamee(c, templatedetails.TemplateName)
AllEntryList, _ := AllEntryList(User.TenantId, webisite.Id)
tmpl, err := template.ParseFiles("websites/themes/"+Template+"/layouts/partials/header.html", "websites/themes/"+Template+"/layouts/partials/footer.html", "websites/themes/"+Template+"/layouts/partials/head.html", "websites/common/layouts/signin.html")
if err != nil {
fmt.Println(err, "templateerr")
}
RenderTemplate(c, tmpl, "signin.html", gin.H{"menulist": newmenulist, "csrf": csrf.GetToken(c), "searchlist": AllEntryList, "template_name": c.Query("template_name")})
}
func ForgotPassword(c *gin.Context) {
User, webisite, err := GetTenantByHost(c)
if err != nil {
fmt.Println(err)
}
newmenulist, err := GetMenuItemsListByTenantID(User.TenantId, webisite.Id)
if err != nil {
fmt.Println(err)
}
AllEntryList, _ := AllEntryList(User.TenantId, webisite.Id)
templatedetails, err := MenuConfig.GetTemplateById(User.GoTemplateDefault, User.TenantId)
Template := GetTemplateNamee(c, templatedetails.TemplateName)
tmpl, err := template.ParseFiles("websites/themes/"+Template+"/layouts/partials/header.html", "websites/themes/"+Template+"/layouts/partials/footer.html", "websites/themes/"+Template+"/layouts/partials/head.html", "websites/common/layouts/forgetPassword.html")
if err != nil {
fmt.Println(err, "templateerr")
}
RenderTemplate(c, tmpl, "forgetPassword.html", gin.H{"menulist": newmenulist, "csrf": csrf.GetToken(c), "searchlist": AllEntryList, "template_name": c.Query("template_name"), "userid": User.Id})
}
//Myprofile//
func TemplateMyProfile(c *gin.Context) {
User, webisite, err := GetTenantByHost(c)
if err != nil {
fmt.Println(err)
}
newmenulist, err := GetMenuItemsListByTenantID(User.TenantId, webisite.Id)
if err != nil {
fmt.Println(err)
}
UserDetailsFunction(c)
memberdet, _ := c.Get("userdetails")
AllEntryList, _ := AllEntryList(User.TenantId, webisite.Id)
templatedetails, _ := MenuConfig.GetTemplateById(User.GoTemplateDefault, User.TenantId)
Template := GetTemplateNamee(c, templatedetails.TemplateName)
tmpl, err := template.ParseFiles("websites/themes/"+Template+"/layouts/partials/header.html", "websites/themes/"+Template+"/layouts/partials/footer.html", "websites/themes/"+Template+"/layouts/partials/head.html", "websites/common/layouts/myprofile.html")
if err != nil {
fmt.Println(err, "templateerr")
}
RenderTemplate(c, tmpl, "myprofile.html", gin.H{"menulist": newmenulist, "csrf": csrf.GetToken(c), "searchlist": AllEntryList, "template_name": c.Query("template_name"), "memberdet": memberdet})
}
//signin functionlity//
func SignIn(c *gin.Context) {
User, website, err := GetTenantByHost(c)
templatedetails, _ := MenuConfig.GetTemplateById(website.TemplateId, User.TenantId)
Template := GetTemplateNamee(c, templatedetails.TemplateName)
if err != nil {
fmt.Println(err)
}
emailid := c.PostForm("emailid")
password := c.PostForm("password")
token, pass, email, _ := models.CheckMemberLogin(emailid, password, User.Id, User.TenantId)
redirectURL := "/signin"
if Template != "" {
redirectURL += "?template_name=" + (Template)
}
if !email {
c.SetCookie("email-toast", "You are not registered with us", 3600, "", "", false, false)
c.Redirect(301, redirectURL)
return
}
if !pass {
c.SetCookie("pass-toast", "Invalid Password", 3600, "", "", false, false)
// c.SetCookie("email", url.QueryEscape(emailid), 3600, "", "", false, false)
c.Redirect(301, redirectURL)
return
}
Session, _ := Store.Get(c.Request, "gotemplates")
Session.Values["token"] = token
Session.Save(c.Request, c.Writer)
c.Redirect(301, "/")
}
func CheckNameInUser(c *gin.Context) {
userid, _ := strconv.Atoi(c.PostForm("id"))
name := c.PostForm("name")
User, _, err := GetTenantByHost(c)
if err != nil {
fmt.Println(err)
}
flg, err := MemberConfig.CheckNameInMember(userid, name, User.TenantId)
if err != nil {
fmt.Printf("User checkname error: %s", err)
json.NewEncoder(c.Writer).Encode(false)
return
}
json.NewEncoder(c.Writer).Encode(flg)
}
func TemplateCheckEmailInMember(c *gin.Context) {
userid, _ := strconv.Atoi(c.PostForm("id"))
email := c.PostForm("email")
User, _, err := GetTenantByHost(c)
if err != nil {
fmt.Println(err)
}
flg, err := MemberConfig.CheckEmailInMember(userid, email, User.TenantId)
if err != nil {
fmt.Printf("User check email error: %s", err)
json.NewEncoder(c.Writer).Encode(false)
return
}
json.NewEncoder(c.Writer).Encode(flg)
}
func NewUserSignUp(c *gin.Context) {
template_name := c.Query("template_name")
username := c.PostForm("username")
email := c.PostForm("email")
password := c.PostForm("password")
// fmt.Println("name::", username)
// fmt.Println("email::", email)
// fmt.Println("password::", password)
User, website, err := GetTenantByHost(c)
templatedetails, _ := MenuConfig.GetTemplateById(website.TemplateId, User.TenantId)
Template := GetTemplateNamee(c, templatedetails.TemplateName)
fmt.Println(Template)
if err != nil {
fmt.Println(err)
}
Member := mem.MemberCreationUpdation{
FirstName: username,
Email: email,
// GroupId: MemberGroupId,
IsActive: 1,
Username: username,
Password: password,
CreatedBy: User.Id,
TenantId: User.TenantId,
}
userdata, Uerr := MemberConfig.CreateMember(Member)
Memberprofile := mem.MemberprofilecreationUpdation{
MemberId: userdata.Id,
ProfileSlug: username,
ProfileName: username,
CreatedBy: User.Id,
TenantId: User.TenantId,
}
merr := MemberConfig.CreateMemberProfile(Memberprofile)
if merr != nil {
fmt.Printf("memberprofile create error: %s", merr)
}
if Uerr != nil {
fmt.Println(Uerr)
}
if template_name != "" {
c.Redirect(301, "/signin?template_name="+template_name)
} else if template_name == "" {
c.Redirect(301, "/signin")
}
}
func Updateprofile(c *gin.Context) {
var MemberGroupId, _ = strconv.Atoi(c.PostForm("membergroupvalue"))
memberbid, _ := strconv.Atoi(c.PostForm("memberid"))
// fmt.Println("mem grp id", MemberGroupId)
imagedata := c.PostForm("crop_data")
User, _, err := GetTenantByHost(c)
if err != nil {
fmt.Println(err)
}
var imageName, imagePath string
if imagedata != "" {
fmt.Println("checkprofileimagepath")
var (
imageByte []byte
err error
)
imageName, imagePath, imageByte, err = ConvertBase64toByte(imagedata, "member")
if err != nil {
ErrorLog.Printf("convert base 64 to byte error : %s", err)
}
imagePath = User.S3FolderName + imagePath
uerr := storagecontroller.UploadCropImageS3(imageName, imagePath, imageByte)
if uerr != nil {
c.SetCookie("Alert-msg", "ERRORAWScredentialsnotfound", 3600, "", "", false, false)
c.Redirect(301, "/myprofile")
return
}
}
Member := map[string]interface{}{
"first_name": c.PostForm("mem_name"),
"last_name": c.PostForm("mem_lname"),
"email": c.PostForm("mem_email"),
"mobile_no": c.PostForm("mem_mobile"),
"member_group_id": MemberGroupId,
"is_active": 1,
"storage_type": "aws",
}
removeImage := c.PostForm("remove_image")
if removeImage == "1" {
Member["profile_image"] = ""
Member["profile_image_path"] = ""
} else if imageName != "" && imagePath != "" {
Member["profile_image"] = imageName
Member["profile_image_path"] = imagePath
}
err = MemberConfigWP.MemberFlexibleUpdate(Member, memberbid, User.Id, User.TenantId)
if err != nil {
fmt.Println("update member error:", err)
}
c.Redirect(301, "/myprofile")
}
// check number in member
func TemplateCheckNumberInMember(c *gin.Context) {
userid, _ := strconv.Atoi(c.PostForm("id"))
number := c.PostForm("number")
User, _, err := GetTenantByHost(c)
if err != nil {
fmt.Println(err)
}
flg, err := MemberConfig.CheckNumberInMember(userid, number, User.TenantId)
if err != nil {
ErrorLog.Printf("member check number error: %s", err)
json.NewEncoder(c.Writer).Encode(false)
return
}
json.NewEncoder(c.Writer).Encode(flg)
}
//Change password page//
func TemplateChangePassword(c *gin.Context) {
token := c.Query("token")
// fmt.Println("tokendfdfdsffd", token)
Claims := jwt.MapClaims{}
_, err := jwt.ParseWithClaims(token, Claims, func(token *jwt.Token) (interface{}, error) {
return []byte(os.Getenv("JWT_SECRET")), nil
})
if err != nil {
if err == jwt.ErrSignatureInvalid {
ErrorLog.Printf("Invalid token change password error: %s", err)
return
}
}
userid := Claims["user_id"]
User, webisite, err := GetTenantByHost(c)
if err != nil {
fmt.Println(err)
}
newmenulist, err := GetMenuItemsListByTenantID(User.TenantId, webisite.Id)
if err != nil {
fmt.Println(err)
}
AllEntryList, _ := AllEntryList(User.TenantId, webisite.Id)
templatedetails, err := MenuConfig.GetTemplateById(User.GoTemplateDefault, User.TenantId)
Template := GetTemplateNamee(c, templatedetails.TemplateName)
tmpl, err := template.ParseFiles("websites/themes/"+Template+"/layouts/partials/header.html", "websites/themes/"+Template+"/layouts/partials/footer.html", "websites/themes/"+Template+"/layouts/partials/head.html", "websites/common/layouts/changepassword.html")
if err != nil {
fmt.Println(err, "templateerr")
}
RenderTemplate(c, tmpl, "changepassword.html", gin.H{"userid": userid, "csrf": csrf.GetToken(c), "menulist": newmenulist, "searchlist": AllEntryList, "template_name": c.Query("template_name")})
}
//New Password function//
func SetNewpassword(c *gin.Context) {
newPassword := c.PostForm("pass")
confirmPassword := c.PostForm("cpass")
userid, _ := strconv.Atoi(c.PostForm("userId"))
User, _, err := GetTenantByHost(c)
if err != nil {
fmt.Println(err)
}
if newPassword == confirmPassword {
err := MemberConfigWP.MemberPasswordUpdate(newPassword, confirmPassword, "", userid, User.Id, User.TenantId)
if err != nil {
ErrorLog.Printf("set new password error: %s", err)
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
return
}
c.SetCookie("get-toast", "Password Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/signin")
}
}
func TemplateLogout(c *gin.Context) {
// Clear the session first
// TEMPLATE_SESSION_KEY
session, err := Store.Get(c.Request, os.Getenv("TEMPLATE_SESSION_KEY"))
if err == nil {
fmt.Println("inside if condition")
session.Values["token"] = ""
session.Options.MaxAge = -1
if err := session.Save(c.Request, c.Writer); err != nil {
ErrorLog.Printf("Logout session save error: %s", err)
}
} else {
fmt.Println("inside else condition")
ErrorLog.Printf("Logout session get error: %s", err)
}
// Set cache control headers before any other output
c.Header("Cache-Control", "no-cache, no-store, must-revalidate")
c.Header("Pragma", "no-cache")
c.Header("Expires", "0")
c.SetCookie(
"gotemplates",
"",
-1,
"/",
"", // empty domain to cover all subdomains
false, // secure
true, // httpOnly
)
// Redirect to the home page
c.Redirect(http.StatusFound, "/")
}
File diff suppressed because it is too large Load Diff
+852
View File
@@ -0,0 +1,852 @@
package controllers
import (
"encoding/json"
"fmt"
"net/http"
storagecontroller "spurt-cms/storage-controller"
"strconv"
"strings"
"github.com/gin-gonic/gin"
"github.com/spurtcms/auth"
cat "github.com/spurtcms/categories"
csrf "github.com/utrack/gin-csrf"
)
var CategoriesImagepath string
type CategoriesFilter struct {
Keyword string
Category string
Status string
FromDate string
ToDate string
}
// Category Parent List
func CategoryGroupList(c *gin.Context) {
var (
limt int
offset int
filter cat.Filter
)
//get values from url query
limit := c.Query("limit")
pageno, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
filter.Keyword = strings.Trim(c.DefaultQuery("keyword", ""), " ")
var filterflag bool
if filter.Keyword != "" {
filterflag = true
} else {
filterflag = false
}
if limit == "" {
limt = Limit
} else {
limt, _ = strconv.Atoi(limit)
}
if pageno != 0 {
offset = (pageno - 1) * limt
}
var FinalCategoriesList []cat.TblCategories
permisison, perr := NewAuth.IsGranted("Categories Group", auth.Read, TenantId)
if perr != nil {
ErrorLog.Printf("categorygrouplist authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("categorygroup authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
CategoryConfig.DataAccess = c.GetInt("dataaccess")
CategoryConfig.UserId = c.GetInt("userid")
categorylist, Total_categories, err := CategoryConfig.CategoryGroupList(limt, offset, cat.Filter(filter), TenantId)
if err != nil {
ErrorLog.Printf("category group list error: %s", err)
}
for _, val := range categorylist {
if !val.ModifiedOn.IsZero() {
val.DateString = val.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
val.DateString = val.CreatedOn.In(TZONE).Format(Datelayout)
}
FinalCategoriesList = append(FinalCategoriesList, val)
}
// _, chcount, _ := category.CategoryGroupList(limt, offset, categories.Filter{})
//pagination calc
paginationendcount := len(categorylist) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(pageno, int(Total_categories), limt)
menu := NewMenuController(c)
translate, _ := TranslateHandler(c)
ModuleName, TabName, _ := ModuleRouteName(c)
uper, _ := NewAuth.IsGranted("Categories Group", auth.Update, TenantId)
dper, _ := NewAuth.IsGranted("Categories Group", auth.Delete, TenantId)
c.HTML(200, "categorygroup.html", gin.H{"Pagination": PaginationData{
NextPage: pageno + 1,
PreviousPage: pageno - 1,
TotalPages: PageCount,
TwoAfter: pageno + 2,
TwoBelow: pageno - 2,
ThreeAfter: pageno + 3,
}, "Menu": menu, "translate": translate, "Searchtrue": filterflag, "lencategory": Total_categories, "csrf": csrf.GetToken(c), "categorylist": FinalCategoriesList, "Count": Total_categories, "Paginationendcount": paginationendcount, "Previous": Previous, "Next": Next, "PageCount": PageCount, "CurrentPage": pageno, "Page": Page, "Filter": filter, "Paginationstartcount": paginationstartcount, "HeadTitle": translate.Categories, "Categoriesmenu": true, "title": ModuleName, "linktitle": ModuleName, "Limit": limt, "Tabmenu": TabName, "permission": uper, "dpermission": dper})
}
}
// Add Category Group
func CreateCategoryGroup(c *gin.Context) {
userid := c.GetInt("userid")
categorygroup := cat.CategoryCreate{
CategoryName: c.PostForm("category_name"),
Description: c.PostForm("category_desc"),
CreatedBy: userid,
TenantId: TenantId,
}
permisison, perr := NewAuth.IsGranted("Categories Group", auth.Create, TenantId)
if perr != nil {
ErrorLog.Printf("createcategorygroup authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("categorygroup authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
err := CategoryConfig.CreateCategoryGroup(categorygroup)
if strings.Contains(fmt.Sprint(err), "given some values is empty") {
ErrorLog.Printf("createcategorygroup mandatory field error: %s", err)
c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
c.Redirect(301, "/admin/categories/")
return
}
if err != nil {
ErrorLog.Printf("createcategorygroup error: %s", perr)
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.Redirect(http.StatusMovedPermanently, "/admin/categories/")
return
}
c.SetCookie("get-toast", "Category Group Created Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(http.StatusMovedPermanently, "/admin/categories/")
}
}
// Category Group Update
func UpdateCategoryGroup(c *gin.Context) {
//get data from html form data
pageno := c.Request.PostFormValue("catpageno")
id, _ := strconv.Atoi(c.PostForm("category_id"))
userid := c.GetInt("userid")
var url string
if pageno != "" {
url = "/admin/categories?page=" + pageno
} else {
url = "/admin/categories/"
}
categorygroup := cat.CategoryCreate{
Id: id,
CategoryName: c.PostForm("category_name"),
Description: c.PostForm("category_desc"),
ModifiedBy: userid,
}
permisison, perr := NewAuth.IsGranted("Categories Group", auth.Update, TenantId)
if perr != nil {
ErrorLog.Printf("updatecategorygroup authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("categorygroup authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
err := CategoryConfig.UpdateCategoryGroup(categorygroup, TenantId)
if strings.Contains(fmt.Sprint(err), "given some values is empty") {
ErrorLog.Printf("updatecategorygroup mandatory field error: %s", perr)
c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
c.Redirect(301, url)
return
}
if err != nil {
ErrorLog.Printf("updatecategorygroup error: %s", perr)
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.Redirect(http.StatusMovedPermanently, url)
return
}
c.SetCookie("get-toast", "Category Group Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(http.StatusMovedPermanently, url)
}
}
// Delete Category Group
func DeleteCategoryGroup(c *gin.Context) {
categoryId, _ := strconv.Atoi(c.Param("id"))
pageno := c.Query("page")
userid := c.GetInt("userid")
var url string
if pageno != "" {
url = "/admin/categories?page=" + pageno
} else {
url = "/admin/categories/"
}
permisison, perr := NewAuth.IsGranted("Categories Group", auth.Delete, TenantId)
if perr != nil {
ErrorLog.Printf("deletecategorygroup authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("categorygroup authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
err := CategoryConfig.DeleteCategoryGroup(categoryId, userid, TenantId)
if strings.Contains(fmt.Sprint(err), "given some values is empty") {
ErrorLog.Printf("deletecategorygroup mandatory field error: %s", perr)
c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
c.Redirect(301, url)
return
}
if err != nil {
ErrorLog.Printf("deletecategorygroup error: %s", perr)
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.Redirect(301, url)
return
}
c.SetCookie("get-toast", "Category Group Deleted Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, url)
}
}
/*Add sub Category list*/
func AddCategory(c *gin.Context) {
var (
limt int
offset int
filter CategoriesFilter
FinalCategoriesList []cat.TblCategories
)
//get data from html form data
parent_id, _ := strconv.Atoi(c.Param("id"))
limit := c.Query("limit")
pageno, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
filter.Keyword = strings.Trim(c.DefaultQuery("keyword", ""), " ")
var filterflag bool
if filter.Keyword != "" {
filterflag = true
} else {
filterflag = false
}
if limit == "" {
limt = Limit
} else {
limt, _ = strconv.Atoi(limit)
}
if pageno != 0 {
offset = (pageno - 1) * limt
}
permisison, perr := NewAuth.IsGranted("Categories", auth.Read, TenantId)
if perr != nil {
ErrorLog.Printf("Addcategory authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("categorygroup authorization error")
c.Redirect(301, "/403-page")
return
}
uper, _ := NewAuth.IsGranted("Categories", auth.Update, TenantId)
dper, _ := NewAuth.IsGranted("Categories", auth.Delete, TenantId)
_, _, _, Total_categories, err := CategoryConfig.ListCategory(0, 0, cat.Filter(filter), parent_id, TenantId)
categorylist, _, _, _, _ := CategoryConfig.ListCategory(offset, limt, cat.Filter(filter), parent_id, TenantId)
if err != nil {
ErrorLog.Printf("categorylist error: %s", err)
}
for _, val := range categorylist {
if !val.ModifiedOn.IsZero() {
val.DateString = val.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
val.DateString = val.CreatedOn.In(TZONE).Format(Datelayout)
}
FinalCategoriesList = append(FinalCategoriesList, val)
}
// _, _, _, catcount, _ := CategoryConfig.ListCategory(offset, limt, cat.Filter{}, parent_id)
_, FinalModalCategoriesList, categorys, catcount, _ := CategoryConfig.ListCategory(offset, limt, cat.Filter{}, parent_id, TenantId)
// _, FinalModalCategoriesList, _, _, _ := CategoryConfig.ListCategory(offset, limt, cat.Filter{}, parent_id)
//pagination calc
paginationendcount := len(categorylist) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(pageno, int(Total_categories), limt)
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
if err != nil {
ErrorLog.Printf("Getmedia error in addcategory error: %s", err)
}
ModuleName, TabName, _ := ModuleRouteName(c)
if TabName == "Categories" {
TabName = "Categories Group"
}
if c.Request.Method == "POST" {
c.JSON(200, gin.H{"CategoryList": FinalCategoriesList, "Count": Total_categories, "translate": translate})
return
}
selectedtype, _ := GetSelectedType()
c.HTML(200, "category.html", gin.H{"Pagination": PaginationData{
NextPage: pageno + 1,
PreviousPage: pageno - 1,
TotalPages: PageCount,
TwoAfter: pageno + 2,
TwoBelow: pageno - 2,
ThreeAfter: pageno + 3,
}, "Menu": menu, "translate": translate, "Searchtrue": filterflag, "catcount": catcount, "csrf": csrf.GetToken(c), "HeadTitle": translate.Categories, "Category": categorys, "Previous": Previous, "Next": Next, "PageCount": PageCount, "Page": Page, "CurrentPage": pageno, "categoryid": parent_id, "ParentCategoryName": categorys.CategoryName, "CategoryList": FinalCategoriesList, "Count": Total_categories, "Paginationendcount": paginationendcount, "Paginationstartcount": paginationstartcount, "Filter": filter, "title": "Categories", "linktitle": "Categories", "FinalModalCategoriesList": FinalModalCategoriesList, "heading": categorys.CategoryName, "Back": "/categories", "Categoriesmenu": true, "Limit": limt, "Tabmenu": TabName, "ModuleName": ModuleName, "StorageType": selectedtype.SelectedType, "permission": uper, "dpermission": dper})
}
// Add Children Category
func AddSubCategory(c *gin.Context) {
//get value from html form data
id := (c.PostForm("categoryid"))
imagedata := c.PostForm("categoryimages")
userid := c.GetInt("userid")
var ParentId, _ = strconv.Atoi(c.PostForm("subcategoryid"))
var imageName, imagePath string
storagetype, err := GetSelectedType()
if err != nil {
ErrorLog.Printf("error get storage type error: %s", err)
}
if storagetype.SelectedType == "local" {
if imagedata != "" {
_, imagePath, err = ConvertBase64(imagedata, strings.TrimPrefix(storagetype.Local+"/categories/addcategory", "/"))
if err != nil {
ErrorLog.Printf("error get storage type error: %s", err)
}
}
} else if storagetype.SelectedType == "aws" {
tenantDetails, err := NewTeam.GetTenantDetails(TenantId)
if err != nil {
ErrorLog.Printf("error get storage type error: %s", err)
}
var imageByte []byte
if imagedata != "" {
imageName, imagePath, imageByte, err = ConvertBase64toByte(imagedata, "categories/addcategory")
if err != nil {
fmt.Println(err)
}
imagePath = tenantDetails.S3FolderName + imagePath
uerr := storagecontroller.UploadCropImageS3(imageName, imagePath, imageByte)
if uerr != nil {
c.SetCookie("Alert-msg", "ERRORAWScredentialsnotfound", 3600, "", "", false, false)
c.Redirect(301, "/admin/categories/")
return
}
}
}
subcategory := cat.CategoryCreate{
CategoryName: c.PostForm("cname"),
Description: c.PostForm("cdesc"),
ImagePath: imagePath,
ParentId: ParentId,
CreatedBy: userid,
TenantId: TenantId,
SeoTitle: c.PostForm("metatitle"),
SeoDescription: c.PostForm("metadesc"),
SeoKeyword: c.PostForm("metakey"),
CategorySlug: c.PostForm("metaslug"),
}
permisison, perr := NewAuth.IsGranted("Categories", auth.Create, TenantId)
if perr != nil {
ErrorLog.Printf("Addsubcategory authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("categorygroup authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
err := CategoryConfig.AddCategory(subcategory)
if strings.Contains(fmt.Sprint(err), "given some values is empty") {
ErrorLog.Printf("Addsubcategory mandatory field error: %s", perr)
c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
c.Redirect(301, "/admin/categories/")
return
}
if err != nil {
ErrorLog.Printf("Addsubcategory error: %s", perr)
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.Redirect(301, "/admin/categories/addcategory/"+id)
return
}
c.SetCookie("get-toast", "Category Created Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/admin/categories/addcategory/"+id)
}
}
// Edit Sub Category
func EditSubCategory(c *gin.Context) {
var id, _ = strconv.Atoi(c.Query("id"))
permisison, perr := NewAuth.IsGranted("Categories", auth.Read, TenantId)
if perr != nil {
ErrorLog.Printf("editsubcategory authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("categorygroup authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
categorys, err := CategoryConfig.GetSubCategoryDetails(id, TenantId)
if err != nil {
ErrorLog.Printf("editsubcategory error :%s", err)
}
c.JSON(200, categorys)
CategoriesImagepath = categorys.ImagePath
}
}
// Update Childern Category
func UpdateSubCategory(c *gin.Context) {
//get value from html form data
ParentId, _ := strconv.Atoi(c.PostForm("pcategoryid"))
imagedata := c.PostForm("image")
userid := c.GetInt("userid")
Categoryid, _ := strconv.Atoi(c.PostForm("id"))
var imageName, imagePath string
storagetype, err := GetSelectedType()
if err != nil {
ErrorLog.Printf("error get storage type error: %s", err)
}
if storagetype.SelectedType == "local" {
if CategoriesImagepath != imagedata {
_, imagePath, err = ConvertBase64(imagedata, strings.TrimPrefix(storagetype.Local+"/categories/addcategory", "/"))
if err != nil {
ErrorLog.Printf("error get storage type error: %s", err)
}
} else {
imagePath = imagedata
}
} else if storagetype.SelectedType == "aws" {
tenantDetails, err := NewTeam.GetTenantDetails(TenantId)
if err != nil {
ErrorLog.Printf("error get storage type error: %s", err)
}
var imageByte []byte
if CategoriesImagepath != imagedata {
imageName, imagePath, imageByte, err = ConvertBase64toByte(imagedata, "categories/addcategory")
if err != nil {
fmt.Println(err)
}
imagePath = tenantDetails.S3FolderName + imagePath
uerr := storagecontroller.UploadCropImageS3(imageName, imagePath, imageByte)
if uerr != nil {
c.SetCookie("Alert-msg", "ERRORAWScredentialsnotfound", 3600, "", "", false, false)
c.Redirect(301, "/admin/categories/")
return
}
} else {
imagePath = imagedata
}
}
subcategory := cat.CategoryCreate{
Id: Categoryid,
CategoryName: c.PostForm("cname"),
Description: c.PostForm("cdesc"),
ImagePath: imagePath,
ParentId: ParentId,
ModifiedBy: userid,
SeoTitle: c.PostForm("metatitle"),
SeoDescription: c.PostForm("metadesc"),
SeoKeyword: c.PostForm("metakey"),
CategorySlug: c.PostForm("metaslug"),
}
// fmt.Println("subcategory::", subcategory)
permisison, perr := NewAuth.IsGranted("Categories", auth.Update, TenantId)
if perr != nil {
ErrorLog.Printf("updatesubcategory authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("categorygroup authorization error")
c.JSON(200, gin.H{"value": false, "url": "/403-page"})
return
}
if permisison {
err := CategoryConfig.UpdateSubCategory(subcategory, TenantId) // update category
if strings.Contains(fmt.Sprint(err), "given some values is empty") {
ErrorLog.Printf("updatesubcategory mandatory field error: %s", perr)
c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
c.Redirect(301, "/admin/categories/")
return
}
if err != nil {
ErrorLog.Printf("updatesubcategory error: %s", perr)
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.JSON(200, gin.H{"value": false})
return
}
c.SetCookie("get-toast", "Category Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.JSON(200, gin.H{"value": true})
}
}
// Delete Children Category
func DeleteSubCategory(c *gin.Context) {
var url string
//get value from html form data
parent_id := (c.Query("categoryid"))
pageno := c.Query("page")
var categoryid, _ = strconv.Atoi(c.Query("id"))
userid := c.GetInt("userid")
if pageno != "" {
url = "/admin/categories/addcategory/" + parent_id + "?page=" + pageno
} else {
url = "/admin/categories/addcategory/" + parent_id
}
permisison, perr := NewAuth.IsGranted("Categories", auth.Delete, TenantId)
if perr != nil {
ErrorLog.Printf("deletesubcategory authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("categorygroup authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
err := CategoryConfig.DeleteSubCategory(categoryid, userid, TenantId) // delete subcategory
if strings.Contains(fmt.Sprint(err), "given some values is empty") {
ErrorLog.Printf("deletesubcategory mandatory error:")
c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
c.Redirect(301, "/admin/categories/")
return
}
if err != nil {
ErrorLog.Printf("deletesubcategory error: %s", perr)
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
} else {
c.SetCookie("get-toast", "Category Deleted Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
}
c.Redirect(301, url)
}
}
// To Check Group Name id Already Exists
func CheckCategoryGroupName(c *gin.Context) {
//get value from html form data
category_id, _ := strconv.Atoi(c.PostForm("category_id"))
category_name := c.PostForm("category_name")
permisison, perr := NewAuth.IsGranted("Categories", auth.Read, TenantId)
if perr != nil {
ErrorLog.Printf("checkcategorygroupname authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("categorygroup authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
flg, err := CategoryConfig.CheckCategroyGroupName(category_id, category_name, TenantId)
if err != nil {
ErrorLog.Printf("checkcategorygroupname error: %s", err)
json.NewEncoder(c.Writer).Encode(false)
return
}
json.NewEncoder(c.Writer).Encode(flg)
}
}
// SubCategory name check
func CheckSubCategoryName(c *gin.Context) {
//get value from html form data
category_id, _ := strconv.Atoi(c.PostForm("parentid"))
permisison, perr := NewAuth.IsGranted("Categories", auth.Read, TenantId)
if perr != nil {
ErrorLog.Printf("CheckSubCategoryName authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("categorygroup authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
categorylistinchk, _, _, _, err := CategoryConfig.ListCategory(0, Limit, cat.Filter{}, category_id, TenantId)
if err != nil {
ErrorLog.Printf("checkcategorygroupname authorization error: %s", err)
}
var catid []int
if len(categorylistinchk) != 0 {
for _, val := range categorylistinchk {
catid = append(catid, val.Id)
}
}
category_name := c.PostForm("cname")
categoryid, _ := strconv.Atoi(c.PostForm("categoryid"))
flg, err := CategoryConfig.CheckSubCategroyName(catid, categoryid, category_name, TenantId)
if err != nil {
ErrorLog.Printf("CheckSubCategoryName error: %s", err)
json.NewEncoder(c.Writer).Encode(false)
return
}
json.NewEncoder(c.Writer).Encode(flg)
}
}
func MultiSelectCategoryGroupDelete(c *gin.Context) {
//get value from html form data
categoryId := c.PostFormArray("categorygrbids[]")
pageno := c.PostForm("page")
userid := c.GetInt("userid")
var url string
permisison, perr := NewAuth.IsGranted("Categories Group", auth.Delete, TenantId)
if perr != nil {
ErrorLog.Printf("CheckSubCategoryName authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("categorygroup authorization error")
c.JSON(200, gin.H{"value": false, "url": "/403-page"})
return
}
if permisison {
categoryIntIds := make([]int, len(categoryId))
for i, id := range categoryId {
intId, _ := strconv.Atoi(id)
categoryIntIds[i] = intId
}
err := CategoryConfig.MultiSelectDeleteCategoryGroup(categoryIntIds, userid, TenantId) //delete selected category group
if err != nil {
ErrorLog.Printf("MultiSelectCategoryGroupDelete error: %s", err)
c.JSON(200, gin.H{"value": false})
return
}
_, Total_categories, _ := CategoryConfig.CategoryGroupList(0, 0, cat.Filter{}, TenantId)
if pageno != "" {
page, _ := strconv.Atoi(pageno)
page = page - 1
multi := page * 10
multiInt64 := int64(multi)
if Total_categories > multiInt64 {
url = "/admin/categories?page=" + pageno
} else {
pagee, _ := strconv.Atoi(pageno)
_page := pagee - 1
pages := strconv.Itoa(_page)
url = "/admin/categories?page=" + pages
}
} else {
url = "/admin/categories/"
}
c.JSON(200, gin.H{"value": true, "url": url})
}
}
func MultiSelectCategoryDelete(c *gin.Context) {
//get value from html form data
categoryId := c.PostFormArray("categoryids[]")
parent_id := (c.PostForm("parentid"))
Parentid, _ := strconv.Atoi(parent_id)
pageno := c.PostForm("page")
userid := c.GetInt("userid")
var url string
permisison, perr := NewAuth.IsGranted("Categories", auth.Delete, TenantId)
if perr != nil {
ErrorLog.Printf("CheckSubCategoryName authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("category authorization error")
c.JSON(200, gin.H{"value": false, "url": "/403-page"})
return
}
if permisison {
categoryIntIds := make([]int, len(categoryId))
for i, id := range categoryId {
intId, _ := strconv.Atoi(id)
categoryIntIds[i] = intId
}
err := CategoryConfig.MultiselectSubCategoryDelete(categoryIntIds, userid, TenantId) //delete selected categories
if err != nil {
ErrorLog.Printf("MultiSelectCategoriesDelete error: %s", err)
c.JSON(200, gin.H{"value": false})
return
}
_, _, _, Total_categories, err := CategoryConfig.ListCategory(0, 0, cat.Filter{}, Parentid, TenantId)
if pageno != "" {
abc, _ := strconv.Atoi(pageno)
abc = abc - 1
multi := abc * 10
multiInt64 := int64(multi)
if Total_categories > multiInt64 {
url = "/admin/categories/addcategory/" + parent_id + "?page=" + pageno
} else {
abcd, _ := strconv.Atoi(pageno)
_page := abcd - 1
pages := strconv.Itoa(_page)
url = "/admin/categories/addcategory/" + parent_id + "?page=" + pages
}
} else {
url = "/admin/categories/addcategory/" + parent_id
}
c.JSON(200, gin.H{"value": true, "url": url})
}
}
@@ -0,0 +1,15 @@
package controllers
import "github.com/gin-gonic/gin"
func CategoriesSettings(c *gin.Context) {
menu := NewMenuController(c)
ModuleName, TabName,_ := ModuleRouteName(c)
translate, _ := TranslateHandler(c)
c.HTML(200, "category_settings.html", gin.H{"Menu": menu, "HeadTitle": translate.Categories, "Categoriesmenu": true, "title": ModuleName, "Tabmenu": TabName})
}
+109
View File
@@ -0,0 +1,109 @@
package controllers
import (
"encoding/json"
"log"
"spurt-cms/models"
"strconv"
"strings"
"github.com/gin-gonic/gin"
csrf "github.com/utrack/gin-csrf"
)
func ChannelSettingView(c *gin.Context) {
//assign need varibles
var (
limit int
offset int
filter models.Filter
templates []models.TblEmailTemplate
template []models.TblEmailTemplate
templatelists []models.TblEmailTemplate
)
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
filter.Keyword = strings.Trim(c.DefaultQuery("keyword", ""), " ")
if c.Query("limit") == "" {
limit = Limit
} else {
limit, _ = strconv.Atoi(c.Query("limit"))
}
if page != 0 {
offset = (page - 1) * limit
}
flag := false
_, Totaltemplates := models.GetTemplateList(&templates, 0, 0, filter, flag, TenantId)
models.GetTemplateList(&template, limit, offset, filter, flag, TenantId)
for _, val := range template {
if !val.ModifiedOn.IsZero() {
val.DateString = val.ModifiedOn.Format(Datelayout)
} else {
val.DateString = val.CreatedOn.Format(Datelayout)
}
templatelists = append(templatelists, val)
}
paginationendcount := len(template) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(page, int(Totaltemplates), limit)
menu := NewMenuController(c)
translate, _ := TranslateHandler(c)
ModuleName, TabName, moduleid := ModuleRouteName(c)
templatelist, _ := models.GetTemplatesByModuleId(moduleid, TenantId)
c.HTML(200, "channelsettings.html", gin.H{"Pagination": PaginationData{
NextPage: page + 1,
PreviousPage: page - 1,
TotalPages: PageCount,
TwoAfter: page + 2,
TwoBelow: page - 2,
ThreeAfter: page + 3,
}, "Menu": menu, "translate": translate, "Page": Page, "Count": Totaltemplates, "Previous": Previous, "Next": Next, "PageCount": PageCount, "CurrentPage": page, "Limit": limit, "Paginationendcount": paginationendcount, "Paginationstartcount": paginationstartcount, "Filter": filter, "Template": templatelist, "csrf": csrf.GetToken(c), "title": ModuleName, "Emailsmenu": true, "Tooltiptitle": translate.Setting.Emailtooltip, "Tabmenu": TabName, "HeadTitle": translate.Channell.Channels})
}
func ChannelSettingUpdate(c *gin.Context) {
var templatedata []map[string]string
if err := json.Unmarshal([]byte(c.Request.PostFormValue("templatestatus")), &templatedata); err != nil {
log.Println(err)
}
// fmt.Println("templatedata", templatedata)
userid := c.GetInt("userid")
var template models.TblEmailTemplate
for _, val := range templatedata {
template.Id, _ = strconv.Atoi(val["templateid"])
template.IsActive, _ = strconv.Atoi(val["status"])
err1 := models.TemplateStatus(template.Id, template.IsActive, userid, TenantId)
if err1 != nil {
log.Println(err1)
}
}
c.SetCookie("get-toast", "Channel Settings Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/entries/settings")
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+48
View File
@@ -0,0 +1,48 @@
package controllers
import (
"log"
"os"
"regexp"
"spurt-cms/config"
"time"
"github.com/gin-gonic/gin"
)
const (
Limit int = 10
MLimit int = 6
)
var (
TZONE, _ = time.LoadLocation(os.Getenv("TIME_ZONE"))
CurrentLanugageId int
Datelayout = "02 Jan 2006 03:04 PM"
LogoPath string
ExpantLogoPath string
PermissionModRoute = []string{}
DB = config.SetupDB()
ErrorLog *log.Logger
WarnLog *log.Logger
Lastlogin = make(map[int]string)
Lang_codearr = []string{"en", "es", "fr", "ger"}
Token string
maxSize = 8 * 1024 * 1024 // 8MB
SecretKey = os.Getenv("JWT_SECRET")
OwndeskUrl = os.Getenv("OWNDESK_URL")
CompanyProfilePath = os.Getenv("COMPANY_PROFILE_PATH")
)
var TenantId string
func Tenant_Id(c *gin.Context) {
TenantId = c.GetString("tenant_id")
}
func RemoveSpecialCharacter(str string) string {
stri := regexp.MustCompile(`[^a-zA-Z0-9 ]+`).ReplaceAllString(str, "")
return stri
}
+497
View File
@@ -0,0 +1,497 @@
package controllers
import (
"encoding/json"
"fmt"
"log"
"strconv"
"strings"
"github.com/gin-gonic/gin"
"github.com/spurtcms/auth"
chn "github.com/spurtcms/channels"
mem "github.com/spurtcms/member"
memaccess "github.com/spurtcms/member-access"
csrf "github.com/utrack/gin-csrf"
)
type memgrp struct {
Memgrp []string `json:"access_granted_memgrps"`
}
type entry struct {
Entries []memaccess.Entry `json:"channelEntries"`
}
/*content access list*/
func ContentAccessControlList(c *gin.Context) {
var (
limt int
offset int
filter memaccess.Filter
)
//get values from html from data
limit := strconv.Itoa(Limit)
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
filter.Keyword = strings.Trim(c.DefaultQuery("keyword", ""), " ")
var filterflag bool
if filter.Keyword != "" {
filterflag = true
} else {
filterflag = false
}
if limit == "" {
limt = Limit
} else {
limt, _ = strconv.Atoi(limit)
}
if page != 0 {
offset = (page - 1) * limt
}
permisison, perr := NewAuth.IsGranted("Member Restrict", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("Member Restrict authorization error:")
}
if !permisison {
ErrorLog.Printf("Member Restrict authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
var FinalContentAccessLists []memaccess.Tblaccesscontrol
MemberaccessConfig.DataAccess = c.GetInt("dataaccess")
MemberaccessConfig.UserId = c.GetInt("userid")
//content access list
contentAccessLists, content_access_count, err := MemberaccessConfig.ContentAccessList(limt, offset, filter, TenantId)
if err != nil {
ErrorLog.Printf("memberaccess list details error: %s", err)
}
for _, val := range contentAccessLists {
if !val.ModifiedOn.IsZero() {
val.DateString = val.ModifiedOn.In(TZONE).Format("02 Jan 2006 03:04 PM")
} else {
val.DateString = val.CreatedOn.In(TZONE).Format("02 Jan 2006 03:04 PM")
}
FinalContentAccessLists = append(FinalContentAccessLists, val)
}
if err != nil {
log.Println(err)
}
paginationendcount := len(contentAccessLists) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, pages := Pagination(page, int(content_access_count), limt)
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
ModuleName, TabName, _ := ModuleRouteName(c)
c.HTML(200, "contentaccesscontrollist.html", gin.H{"Pagination": PaginationData{
NextPage: page + 1,
PreviousPage: page - 1,
TotalPages: PageCount,
TwoAfter: page + 2,
TwoBelow: page - 2,
ThreeAfter: page + 3,
}, "Menu": menu, "title": ModuleName, "Searchtrue": filterflag, "linktitle": "Member Restrict", "csrf": csrf.GetToken(c), "translate": translate, "Count": content_access_count, "Previous": Previous, "Next": Next, "PageCount": PageCount, "CurrentPage": page, "Limit": limt, "Paginationendcount": paginationendcount, "Paginationstartcount": paginationstartcount, "Pages": pages, "Filter": filter, "ContentAccess": FinalContentAccessLists, "Length": len(FinalContentAccessLists), "HeadTitle": translate.Memberss.Members, "Membermenu": true, "Restrictmenu": true, "Tabmenu": TabName})
}
}
/*create content access control*/
func NewContentAccess(c *gin.Context) {
var (
spaceDefault string
ChannelDetails []chn.Tblchannel
)
filter := ""
permisison, perr := NewAuth.IsGranted("Member Restrict", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("Member Restrict authorization error:")
}
if !permisison {
ErrorLog.Printf("Member Restrict authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
channelCount, err := ChannelConfig.GetChannelCount(TenantId) //get channel count
if err != nil {
ErrorLog.Printf("channel count error: %s", err)
}
_, memgrpcount, err := MemberConfig.ListMemberGroup(mem.MemberGroupListReq{ActiveGroupsOnly: true}, TenantId) // get active member group count
if err != nil {
ErrorLog.Printf("channel count error: %s", err)
}
membergroup, _, err := MemberConfig.ListMemberGroup(mem.MemberGroupListReq{Limit: int(memgrpcount), ActiveGroupsOnly: true}, TenantId) // get active member group
if err != nil {
ErrorLog.Printf("channel count error: %s", err)
}
menu := NewMenuController(c)
translate, _ := TranslateHandler(c)
// fmt.Println("check _is", TenantId)
ChannelDetails, err = ChannelConfig.GetChannelsWithEntries(TenantId) //get active channel&entries list
if err != nil {
ErrorLog.Printf("channel count error: %s", err)
}
spaceDefault = "channel"
ModuleName, TabName, _ := ModuleRouteName(c)
c.HTML(200, "addcontentaccess.html", gin.H{"Menu": menu, "linktitle": "Create Content Access", "csrf": csrf.GetToken(c), "translate": translate, "Filter": filter, "Membergroup": membergroup, "Button": "Save", "MembergroupLength": len(membergroup), "HeadTitle": translate.Memberaccess, "ChannelDetails": ChannelDetails, "ChannelLength": len(ChannelDetails), "ChannelCount": channelCount, "MemberCount": memgrpcount, "Membermenu": true, "Restrictmenu": true, "SpaceDefault": spaceDefault, "Tabmenu": TabName, "title": ModuleName, "Accesscontent": "Create Memberaccess"})
}
}
func GrantContentAccessControl(c *gin.Context) {
var (
entriez entry
memgrp_parse memgrp
conv_memgrps []int
)
//get values from html form data
title := c.PostForm("title")
entries := c.PostForm("entries")
memgrps := c.PostForm("memgrps")
userid := c.GetInt("userid")
fmt.Println("title", title, entries, memgrps)
json.Unmarshal([]byte(memgrps), &memgrp_parse)
json.Unmarshal([]byte(entries), &entriez)
memgrp_array := memgrp_parse.Memgrp
entries_array := entriez.Entries
if title == "" || len(memgrp_array) == 0 || len(entries_array) == 0 {
c.SetCookie("Alert-msg", "Please grant atleast one page access to MemberGroups", 3600, "", "", false, false)
return
}
for _, memgrp_id := range memgrp_array {
conv_memgrp_id, _ := strconv.Atoi(memgrp_id)
conv_memgrps = append(conv_memgrps, conv_memgrp_id)
}
permisison, perr := NewAuth.IsGranted("Member Restrict", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("Member Restrict authorization error:")
}
if !permisison {
ErrorLog.Printf("Member Restrict authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
// fmt.Println("idcheck", TenantId)
acc, cerr := MemberaccessConfig.CreateAccessControl(title, userid, TenantId) //create contentaccess
if cerr != nil {
ErrorLog.Printf("memberaccess create error: %s", cerr)
}
cherr := MemberaccessConfig.CreateRestrictEntries(acc.Id, conv_memgrps, entries_array, userid, TenantId) //create accessentries
if cherr != nil {
ErrorLog.Printf("createaccesscontrolpage error: %s", cherr)
}
if cerr != nil {
log.Println(cerr)
json.NewEncoder(c.Writer).Encode(false)
}
c.SetCookie("get-toast", "Content Access Rights Granted Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
json.NewEncoder(c.Writer).Encode(true)
}
}
func EditContentAcess(c *gin.Context) {
var (
spaceDefault string
ChannelDetails []chn.Tblchannel
)
content_access_id, _ := strconv.Atoi(c.Param("accessId"))
permisison, perr := NewAuth.IsGranted("Member Restrict", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("Member Restrict authorization error:")
}
if !permisison {
ErrorLog.Printf("Member Restrict authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
accessControl, err := MemberaccessConfig.GetControlAccessById(content_access_id, TenantId)
if err != nil {
ErrorLog.Printf("memberaccess list details error: %s", err)
}
channelCount, err := ChannelConfig.GetChannelCount(TenantId)
if err != nil {
ErrorLog.Printf("getchannelcount error: %s", err)
}
_, memgrpcount, err := MemberConfig.ListMemberGroup(mem.MemberGroupListReq{ActiveGroupsOnly: true}, TenantId) //get membergroup count
if err != nil {
ErrorLog.Printf("membergroupcount error: %s", err)
}
membergroup, _, err := MemberConfig.ListMemberGroup(mem.MemberGroupListReq{Limit: int(memgrpcount), ActiveGroupsOnly: true}, TenantId) //get active member group
if err != nil {
ErrorLog.Printf("membergroup error: %s", err)
}
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
ChannelDetails, err = ChannelConfig.GetChannelsWithEntries(TenantId) //get active channel&entries list
if err != nil {
ErrorLog.Printf("getchannelentries error: %s", err)
}
spaceDefault = "channel"
ModuleName, TabName, _ := ModuleRouteName(c)
if strings.Contains(c.Request.URL.Path, "copy-accesscontrol") {
c.HTML(200, "addcontentaccess.html", gin.H{"Menu": menu, "csrf": csrf.GetToken(c), "translate": translate, "Membergroup": membergroup, "MembergroupLength": len(membergroup), "HeadTitle": translate.Memberaccess, "ChannelDetails": ChannelDetails, "ChannelLength": len(ChannelDetails), "ChannelCount": channelCount, "MemberCount": memgrpcount, "AccessControl": accessControl, "Button": "Copy", "Membermenu": true, "Restrictmenu": true, "SpaceDefault": spaceDefault, "Tabmenu": TabName, "title": ModuleName, "Accesscontent": "Edit Memberaccess"})
return
}
c.HTML(200, "addcontentaccess.html", gin.H{"Menu": menu, "linktitle": "Edit Content Access", "csrf": csrf.GetToken(c), "translate": translate, "Membergroup": membergroup, "MembergroupLength": len(membergroup), "HeadTitle": translate.Memberaccess, "ChannelDetails": ChannelDetails, "ChannelLength": len(ChannelDetails), "ChannelCount": channelCount, "MemberCount": memgrpcount, "AccessControl": accessControl, "Button": "Update", "Membermenu": true, "Restrictmenu": true, "SpaceDefault": spaceDefault, "Tabmenu": TabName, "title": ModuleName, "Accesscontent": "Edit Memberaccess"})
}
}
func GetContentAccessPages(c *gin.Context) {
var (
conv_memgrpIds []string
conv_spaceIds []string
conv_channelIds []string
)
accessId, _ := strconv.Atoi(c.Query("content_access_id"))
permisison, perr := NewAuth.IsGranted("Member Restrict", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("Member Restrict authorization error:")
}
if !permisison {
ErrorLog.Printf("Member Restrict authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
accessControl, aerr := MemberaccessConfig.GetControlAccessById(accessId, TenantId) //content access
if aerr != nil {
ErrorLog.Printf("getmemberaccess error: %s", aerr)
}
membergroupIds, merr := MemberaccessConfig.GetaccessMemberGroup(accessId, TenantId) //access membergroup
if merr != nil {
ErrorLog.Printf("getaccessmembergroup error: %s", merr)
}
channelIds, channelEntries, cerr := MemberaccessConfig.GetselectedEntiresByAccessControlId(accessId, TenantId) //access entries
if cerr != nil {
ErrorLog.Printf("getaccessentries list details error: %s", cerr)
}
for _, memgrpId := range membergroupIds {
conv_memgrpId := strconv.Itoa(memgrpId)
conv_memgrpIds = append(conv_memgrpIds, conv_memgrpId)
}
for _, channelId := range channelIds {
conv_channelid := strconv.Itoa(channelId)
conv_channelIds = append(conv_channelIds, conv_channelid)
}
c.JSON(200, gin.H{"AccessId": accessControl, "MemberGroups": conv_memgrpIds, "Spaces": conv_spaceIds, "Channels": conv_channelIds, "ChannelEntries": channelEntries})
}
}
func UpdateContentAccessControl(c *gin.Context) {
var (
memgrp_parse memgrp
entriez entry
conv_memgrps []int
)
//get values from hmtl form data
accessId, _ := strconv.Atoi(c.PostForm("content_access_id"))
title := c.PostForm("title")
entries := c.PostForm("entries")
memgrps := c.PostForm("memgrps")
json.Unmarshal([]byte(memgrps), &memgrp_parse)
json.Unmarshal([]byte(entries), &entriez)
memgrp_array := memgrp_parse.Memgrp
entries_array := entriez.Entries
if title == "" || len(memgrp_array) == 0 || len(entries_array) == 0 {
c.SetCookie("Alert-msg", "Please grant atleast one page access to MemberGroups", 3600, "", "", false, false)
return
}
for _, memgrp_id := range memgrp_array {
conv_memgrp_id, _ := strconv.Atoi(memgrp_id)
conv_memgrps = append(conv_memgrps, conv_memgrp_id)
}
userid := c.GetInt("userid")
permisison, perr := NewAuth.IsGranted("Member Restrict", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("Member Restrict authorization error:")
}
if !permisison {
ErrorLog.Printf("Member Restrict authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
err := MemberaccessConfig.UpdateAccessControl(accessId, title, userid, TenantId) //update access control
if err != nil {
ErrorLog.Printf("updateaccesscontrol error: %s", err)
}
uerr := MemberaccessConfig.UpdateRestrictEntries(accessId, conv_memgrps, entries_array, userid, TenantId) //update accesscontrol page
if uerr != nil {
ErrorLog.Printf("updateaccesscontrolpage error: %s", uerr)
}
if err != nil {
log.Println(err)
json.NewEncoder(c.Writer).Encode(false)
}
c.SetCookie("get-toast", "Content Access Rights Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
json.NewEncoder(c.Writer).Encode(true)
return
}
c.Redirect(301, "/403-page")
}
func DeleteAccessControl(c *gin.Context) {
var url string
accessId, _ := strconv.Atoi(c.Param("accessId"))
userid := c.GetInt("userid")
permisison, perr := NewAuth.IsGranted("Member Restrict", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("Member Restrict authorization error:")
}
if !permisison {
ErrorLog.Printf("Member Restrict authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
err := MemberaccessConfig.DeleteMemberAccessControl(accessId, userid, TenantId) //deleteaccesscontrol
if err != nil {
ErrorLog.Printf("deleteaccescontrol error: %s", err)
}
pageno := c.Query("page")
if pageno != "" {
url = "/memberaccess?page=" + pageno
} else {
url = "/memberaccess/"
}
c.SetCookie("get-toast", "Content Access Rights Deleted Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, url)
}
}
func GetChannelsAndItsEntries(c *gin.Context) {
Channellist, err := ChannelConfig.GetChannelsWithEntries(TenantId) //get active chennal&entries
if err != nil {
log.Println(err)
}
c.JSON(200, gin.H{"Channels": Channellist})
}
+203
View File
@@ -0,0 +1,203 @@
package controllers
import (
"sort"
"spurt-cms/models"
"strings"
"time"
"github.com/gin-gonic/gin"
chn "github.com/spurtcms/channels"
formbuilders "github.com/spurtcms/forms-builders"
mem "github.com/spurtcms/member"
csrf "github.com/utrack/gin-csrf"
)
var LastUpdatedTime string
func LastUpdated() string {
currentTime := time.Now()
LastUpdatedTime = time.Now().Format("2 Jan 2006")
return currentTime.Format("02-01-2006")
}
func DashboardView(c *gin.Context) {
var (
user_id = c.GetInt("userid")
memlist []mem.Tblmember
newEntries []chn.Tblchannelentries
allchnentry []chn.Tblchannelentries
chaid int
newblocks []models.TblBlock
newformlist []formbuilders.TblForms
usercount int
Newusercount int
membercount int
Newmembercount int
)
menu := NewMenuController(c)
usercount, Newusercount, _ = NewTeamWP.DashboardUserCount(TenantId)
// usercount, Newusercount, _ := NewTeamWP.DashboardUserCount(TenantId)
membercount, Newmembercount, _ = MemberConfigWP.DashboardMemberCount(TenantId)
Totalentris, Newentrycount, _ := ChannelConfigWP.DashboardEntriesCount(TenantId)
Totalblock, Newblockcount, _ := BlockConfig.DashBoardBlockCount(TenantId)
// Pagescount, Newpagescount, _ := CoursesConfigWP.DashboardPagesCount()
Newactivelist, _ := ChannelConfigWP.DashboardRecentActivites(TenantId)
var NewActive []chn.RecentActivities
for _, val := range Newactivelist {
if val.Imagepath != "" {
val.Imagepath = "/image-resize?name=" + val.Imagepath
}
NewActive = append(NewActive, val)
}
memfilter := mem.Filter{Keyword: strings.Trim(c.DefaultQuery("keyword", ""), " ")}
memflag := false
memberlist, _, _ := MemberConfigWP.ListMembers(0, 0, memfilter, memflag, TenantId)
maxmem := 5
if len(memberlist) != 0 {
for i := 0; i < len(memberlist) && i < maxmem; i++ {
memberlist[i].CreatedDate = memberlist[i].CreatedOn.In(TZONE).Format(Datelayout)
if !memberlist[i].ModifiedOn.IsZero() {
memberlist[i].ModifiedDate = memberlist[i].ModifiedOn.In(TZONE).Format(Datelayout)
} else {
memberlist[i].ModifiedDate = memberlist[i].CreatedOn.In(TZONE).Format(Datelayout)
}
memlist = append(memlist, memberlist[i])
}
}
flag1 := true
Finalchannelslist, _, _ := ChannelConfigWP.ListChannel(chn.Channels{Limit: 100, Offset: 0, IsActive: flag1, TenantId: TenantId})
sort.Slice(Finalchannelslist, func(i, j int) bool {
return Finalchannelslist[i].EntriesCount > Finalchannelslist[j].EntriesCount
})
var chnallist []chn.Tblchannel
for _, val := range Finalchannelslist {
_, _, entrcount, _ := ChannelConfig.ChannelEntriesList(chn.Entries{ChannelId: val.Id, Limit: 0, Offset: 0, Keyword: "", ChannelName: "", Title: "", Status: ""}, TenantId)
val.EntriesCount = entrcount
chnallist = append(chnallist, val)
}
maxRecords := 6
if len(chnallist) < maxRecords {
maxRecords = len(chnallist)
}
topsix_channels := chnallist[:maxRecords]
chnentry, _, _, _ := ChannelConfigWP.ChannelEntriesList(chn.Entries{ChannelId: chaid}, TenantId)
for _, entry := range chnentry {
entry.CreatedDate = entry.CreatedOn.In(TZONE).Format(Datelayout)
if !entry.ModifiedOn.IsZero() {
entry.ModifiedDate = entry.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
entry.ModifiedDate = entry.CreatedOn.In(TZONE).Format(Datelayout)
}
allchnentry = append(allchnentry, entry)
}
maxLength := 6
for i := 0; i < len(allchnentry) && i < maxLength; i++ {
newEntries = append(newEntries, allchnentry[i])
}
BlockConfig.UserId = c.GetInt("userid")
// BlockConfig.DataAccess =
// blocklist, _, _ := BlockConfig.BlockList(100, 0, blocks.Filter{}, TenantId)
blocklist, _, _ := models.BlockLists(100, 0, models.Filter{}, TenantId)
var allblocks []models.TblBlock
for _, block := range blocklist {
block.CreatedDate = block.CreatedOn.In(TZONE).Format(Datelayout)
if !block.ModifiedOn.IsZero() {
block.ModifiedDate = block.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
block.ModifiedDate = block.CreatedOn.In(TZONE).Format(Datelayout)
}
allblocks = append(allblocks, block)
}
for i := 0; i < len(allblocks) && i < maxLength; i++ {
newblocks = append(newblocks, allblocks[i])
}
Formlist, _, _, _ := FormConfig.FormBuildersList(100, 0, formbuilders.Filter{}, TenantId, 1, 0, "", 0)
var allformlist []formbuilders.TblForms
for _, form := range Formlist {
form.CreatedDate = form.CreatedOn.In(TZONE).Format(Datelayout)
if !form.ModifiedOn.IsZero() {
form.ModifiedDate = form.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
form.ModifiedDate = form.CreatedOn.In(TZONE).Format(Datelayout)
}
allformlist = append(allformlist, form)
}
for i := 0; i < len(allformlist) && i < maxLength; i++ {
newformlist = append(newformlist, allformlist[i])
}
// mostlyviewlist, _ := CoursesConfigWP.MostlyViewList(MLimit, TenantId)
// recentlyviewlist, _ := CoursesConfigWP.RecentlyViewList(MLimit, TenantId)
activememberlist, _ := MemberConfigWP.ActiveMemberList(MLimit, TenantId)
var activememberlist1 []mem.Tblmember
for _, val := range activememberlist {
val.DateString = val.LoginTime.In(TZONE).Format(Datelayout)
activememberlist1 = append(activememberlist1, val)
}
translate, _ := TranslateHandler(c)
userdata, _, _ := NewTeam.GetUserById(user_id, []int{})
if !userdata.LastLogin.IsZero() {
Lastactive := userdata.LastLogin.In(TZONE).Format(Datelayout)
Lastlogin[user_id] = Lastactive
} else {
Lastlogin[user_id] = "--"
}
c.HTML(200, "dashboard.html", gin.H{"Menu": menu, "csrf": csrf.GetToken(c), "translate": translate, "memberlist": memlist, "recentactivity": NewActive, "Lastlogin": Lastlogin[user_id], "channelslist": topsix_channels, "newentries": newEntries, "usercount": usercount, "Newusercount": Newusercount, "membercount": membercount, "Newmembercount": Newmembercount, "entriscount": Totalentris, "Newentrycount": Newentrycount, "HeadTitle": translate.Dashboard, "title": translate.Dashboard, "linktitle": "Dashboard", "activememberlist": activememberlist1, "Dashboardmenu": true, "blockcount": Totalblock, "newblockcount": Newblockcount, "Blocklist": newblocks, "Formlist": newformlist})
}
func TruncateDescription(description string, limit int) string {
if len(description) <= limit {
return description
}
truncated := description[:limit] + "..."
return truncated
}
File diff suppressed because it is too large Load Diff
+70
View File
@@ -0,0 +1,70 @@
package controllers
import (
"log"
"os"
"spurt-cms/models"
"github.com/gin-gonic/gin"
csrf "github.com/utrack/gin-csrf"
"gorm.io/datatypes"
)
func EmailConfig(c *gin.Context) {
menu := NewMenuController(c)
translate, _ := TranslateHandler(c)
var mail models.TblEmailConfigurations
err := models.GetMail(&mail, TenantId)
if err != nil {
log.Println(err)
}
var email models.SmtpConfig
if mail.SmtpConfig != nil {
email.Mail = mail.SmtpConfig["Mail"].(string)
email.Password = mail.SmtpConfig["Password"].(string)
email.Host = mail.SmtpConfig["Host"].(string)
email.Port = mail.SmtpConfig["Port"].(string)
}
c.HTML(200, "emailconfig.html", gin.H{"csrf": csrf.GetToken(c), "Smtpdiv": false, "Maildetails": mail, "EnvHost": os.Getenv("MAIL_HOST"), "EnvMail": os.Getenv("MAIL_USERNAME"), "EnvPassword": os.Getenv("MAIL_PASSWORD"), "EnvPort": os.Getenv("MAIL_PORT"), "Email": email, "Menu": menu, "translate": translate, "HeadTitle": translate.Email, "SettingsHead": true, "Emailconfigmenu": true, "title": "Email Configuration", "linktitle": "Email Configuration"})
}
func CreateEmailConfig(c *gin.Context) {
//get data form html form data
mail := c.PostForm("email")
password := c.PostForm("password")
host := c.PostForm("host")
port := c.PostForm("port")
seltype := c.PostForm("seltype")
var Email models.TblEmailConfigurations
Email.Id = 1
Email.SelectedType = seltype
Email.SmtpConfig = datatypes.JSONMap{"Mail": mail, "Password": password, "Host": host, "Port": port}
_, err := models.UpdateMail(&Email, TenantId)
if err != nil {
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.SetCookie("Alert-msg", "alert", 3600, "", "", false, false)
c.Redirect(301, "/settings/emails/emailconfig/")
return
}
c.SetCookie("get-toast", "Email Configuration Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/settings/emails/emailconfig/")
}
+150
View File
@@ -0,0 +1,150 @@
package controllers
import (
"spurt-cms/models"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
csrf "github.com/utrack/gin-csrf"
)
func EmailTemplate(c *gin.Context) {
var (
limit, offset int
filter models.Filter
templates []models.TblEmailTemplate
template []models.TblEmailTemplate
templatelists []models.TblEmailTemplate
)
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
if c.Query("limit") == "" {
limit = Limit
} else {
limit, _ = strconv.Atoi(c.Query("limit"))
}
if page != 0 {
offset = (page - 1) * limit
}
filter.Keyword = strings.Trim(c.DefaultQuery("keyword", ""), " ")
flag := false
_, Totaltemplates := models.GetTemplateList(&templates, 0, 0, filter, flag, TenantId)
models.GetTemplateList(&template, limit, offset, filter, flag, TenantId)
for _, val := range template {
if !val.ModifiedOn.IsZero() {
val.DateString = val.ModifiedOn.Format(Datelayout)
} else {
val.DateString = val.CreatedOn.Format(Datelayout)
}
templatelists = append(templatelists, val)
}
paginationendcount := len(template) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(page, int(Totaltemplates), limit)
menu := NewMenuController(c)
translate, _ := TranslateHandler(c)
c.HTML(200, "emailtemplate.html", gin.H{"Pagination": PaginationData{
NextPage: page + 1,
PreviousPage: page - 1,
TotalPages: PageCount,
TwoAfter: page + 2,
TwoBelow: page - 2,
ThreeAfter: page + 3,
}, "Menu": menu, "HeadTitle": translate.Memberss.Email, "translate": translate, "Page": Page, "Count": Totaltemplates, "Previous": Previous, "Next": Next, "PageCount": PageCount, "CurrentPage": page, "Limit": limit, "Paginationendcount": paginationendcount, "Paginationstartcount": paginationstartcount, "Filter": filter, "Template": templatelists, "csrf": csrf.GetToken(c), "SettingsHead": true, "title": "Email Templates", "linktitle": "Email Templates", "Emailsmenu": true, "Tooltiptitle": translate.Setting.Emailtooltip})
}
func EditTemplate(c *gin.Context) {
var (
temp models.TblEmailTemplate
err error
id int
)
id, err = strconv.Atoi(c.Query("id"))
if err != nil {
c.JSON(500, "")
}
models.GetTempdetail(&temp, id, TenantId)
c.JSON(200, temp)
}
func UpdateTemplate(c *gin.Context) {
if c.PostForm("tempdesc") == "" || c.PostForm("tempsub") == "" || c.PostForm("temcont") == "" {
c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/emails/")
return
}
var (
template models.TblEmailTemplate
url string
)
// fmt.Println("Test")
pageno := c.PostForm("pageno")
pathname := c.PostForm("pathname")
if pathname != "" {
url = pathname
} else if pageno != "" {
url = "/admin/settings/emails?page=" + pageno
} else {
url = "/admin/settings/emails/"
}
template.TemplateName = c.PostForm("tempname")
template.TemplateSubject = (c.PostForm("tempsub"))
template.TemplateMessage = c.PostForm("temcont")
template.TemplateDescription = c.PostForm("tempdesc")
template.ModifiedBy = c.GetInt("userid")
template.Id, _ = strconv.Atoi(c.PostForm("userid"))
template.ModifiedOn, _ = time.Parse("2006-01-02 15:04:05", time.Now().In(TZONE).Format("2006-01-02 15:04:05"))
err := models.UpdateTemplate(&template, TenantId)
if err != nil {
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.Redirect(301, url)
return
}
c.SetCookie("get-toast", "Templateupdatedsuccessfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, url)
}
/* template status*/
func TempIsActive(c *gin.Context) {
id, _ := strconv.Atoi(c.Request.PostFormValue("id"))
val, _ := strconv.Atoi(c.Request.PostFormValue("isactive"))
userid := c.GetInt("userid")
err := models.TemplateStatus(id, val, userid, TenantId)
if err != nil {
c.JSON(500, gin.H{"status": false})
}
c.JSON(200, gin.H{"status": true})
}
File diff suppressed because it is too large Load Diff
+10
View File
@@ -0,0 +1,10 @@
package controllers
import "errors"
var (
ErrInternalServerError = "internalserverr"
ErrLoadLocation = errors.New("timeZone not found")
ErrGettingTemplateList = errors.New("unable to fetch the template list")
ErrGettingTemplateModuleList = errors.New("unable to fetch the template module list")
)
File diff suppressed because it is too large Load Diff
+303
View File
@@ -0,0 +1,303 @@
package controllers
import (
"fmt"
"spurt-cms/models"
storagecontroller "spurt-cms/storage-controller"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
csrf "github.com/utrack/gin-csrf"
)
// set default timezone in general settings
func SetInitialGeneralValues() {
tblgeneralsetting, err := models.GetGeneralSettings(TenantId)
// fmt.Println("defaultValues", tblgeneralsetting)
if err != nil {
zone, _ := time.LoadLocation("Asia/Kolkata")
ErrorLog.Printf("Getting data from general settings Error: %s", err)
TZONE = zone
CurrentLanugageId = 1
Datelayout = "02 Jan 2006 3:04 pm"
return
}
CurrentLanugageId = tblgeneralsetting.LanguageId
LogoPath = tblgeneralsetting.LogoPath
ExpantLogoPath = tblgeneralsetting.ExpandLogoPath
Datelayout = DateFormater(tblgeneralsetting.DateFormat, tblgeneralsetting.TimeFormat)
zone, zerr := time.LoadLocation(tblgeneralsetting.TimeZone)
if zerr != nil {
fmt.Println(zerr)
ErrorLog.Printf("Invalid Timezone Error: %s", err)
TZONE = zone
return
}
TZONE = zone
}
func GeneralSettings(c *gin.Context) {
roleId := c.GetInt("role")
// fmt.Println("roleId", roleId)
// fmt.Println("tenantIdGetSettings", TenantId)
tblgeneralsetting, err := models.GetGeneralSettings(TenantId)
if err != nil {
ErrorLog.Printf("Getting data from general settings Error:%s", err)
}
// fmt.Println("dateFormattttt", tblgeneralsetting.DateFormat)
var language1 []models.TblLanguage
query.DataAccess = c.GetInt("dataaccess")
query.UserId = c.GetInt("userid")
Language, _ := query.GetLanguageList(&language1, 0, 0, models.Filter{}, true, TenantId)
selectedtype, err := GetSelectedType()
if err != nil {
ErrorLog.Printf("Getting data from selected type Error:%s", err)
}
if !strings.Contains(tblgeneralsetting.LogoPath, "/public/img/") {
if tblgeneralsetting.LogoPath != "" {
if tblgeneralsetting.StorageType == "local" {
tblgeneralsetting.LogoPath = "/" + tblgeneralsetting.LogoPath
} else if tblgeneralsetting.StorageType == "aws" {
tblgeneralsetting.LogoPath = "/image-resize?name=" + tblgeneralsetting.LogoPath
}
}
}
menu := NewMenuController(c)
translate, _ := TranslateHandler(c)
timezones, err := models.GetTimeZones(TenantId)
if err != nil {
ErrorLog.Printf("Getting data from general settings Error:%s", err)
}
c.HTML(200, "general-settings.html", gin.H{"csrf": csrf.GetToken(c), "HeadTitle": translate.Setting.Generalsettings, "Menu": menu, "translate": translate, "SettingsHead": true, "Generalmenu": true, "Tooltiptitle": translate.Setting.Teamstooltip, "title": "General Settings", "linktitle": "General Settings", "GeneralSetting": tblgeneralsetting, "Langugage": Language, "TimeZone": timezones, "StorageType": selectedtype.SelectedType, "RoleId": roleId})
}
func DateFormater(date string, time string) string {
var Layout string
switch date {
case "dd/mm/yyyy":
if time == "12" {
Layout = "02/01/2006 3:04 pm"
} else {
Layout = "02/01/2006 15:04"
}
case "mm/dd/yyyy":
if time == "12" {
Layout = "01/02/2006 3:04 pm"
} else {
Layout = "01/02/2006 15:04"
}
case "dd-mm-yyyy":
if time == "12" {
Layout = "01-02-2006 3:04 pm"
} else {
Layout = "01-02-2006 15:04"
}
case "yyyy-mm-dd":
if time == "12" {
Layout = "2006-01-02 3:04 pm"
} else {
Layout = "2006-01-02 15:04"
}
case "dd mmm yyyy":
if time == "12" {
Layout = "02 Jan 2006 3:04 pm"
} else {
Layout = "02 Jan 2006 15:04"
}
default:
if time == "12" {
Layout = "02 Jan 2006 3:04 pm"
} else {
Layout = "02 Jan 2006 15:04"
}
}
return Layout
}
func SetTimeZone(timezone string) {
zone, err := time.LoadLocation(timezone)
if err != nil {
fmt.Println(ErrLoadLocation)
fmt.Println("Set Default UTC")
}
TZONE = zone
}
func UpdateGeneralSettings(c *gin.Context) {
companyName := c.PostForm("companyname")
// imagePath1 := c.PostForm("logo_imgpath")
expandimagePath := c.PostForm("expandlogo_imgpath")
dateFormat := c.PostForm("dateformat")
timeForamt := c.PostForm("timeformat")
timezone := c.PostForm("timezon")
languagedefault, _ := strconv.Atoi(c.PostForm("language"))
// fmt.Println("dateFOrmat", dateFormat)
var (
imgPath string
err error
)
response := make(gin.H)
storageType, err := GetSelectedType()
if err != nil {
ErrorLog.Println(err)
response["status"] = 0
c.AbortWithStatusJSON(500, response)
return
}
if strings.Contains(expandimagePath, "data:image/jpeg;base64") || strings.Contains(expandimagePath, "data:image/png;base64") || strings.Contains(expandimagePath, "data:image/svg+xml;base64") {
tenantDetails, err := NewTeam.GetTenantDetails(TenantId)
if err != nil {
ErrorLog.Println(err)
response["status"] = 0
c.AbortWithStatusJSON(500, response)
return
}
if storageType.SelectedType == "aws" {
var (
tempString, imageName string
imageByte []byte
)
imageName, tempString, imageByte, err = ConvertBase64toByte(expandimagePath, "user")
if err != nil {
ErrorLog.Println(err)
response["status"] = 0
c.AbortWithStatusJSON(500, response)
return
}
tempString = tenantDetails.S3FolderName + tempString
err = storagecontroller.UploadCropImageS3(imageName, tempString, imageByte)
if err != nil {
ErrorLog.Println(err)
c.SetCookie("Alert-msg", "ERRORAWScredentialsnotfound", 3600, "", "", false, false)
response["status"] = 0
c.AbortWithStatusJSON(500, response)
return
}
imgPath = tempString
} else if storageType.SelectedType == "local" {
var tempImgPath string
_, tempImgPath, err = ConvertBase64(expandimagePath, "storage/user")
if err != nil {
ErrorLog.Println(err)
response["status"] = 0
c.AbortWithStatusJSON(500, response)
return
}
imgPath = "/" + tempImgPath
}
} else {
prefixEndIndex := strings.Index(expandimagePath, "=")
fmt.Println("prefix", prefixEndIndex)
prefixRemovedPath := expandimagePath[prefixEndIndex+1:]
// fmt.Println("prefixRemoved", prefixRemovedPath)
imgPath = prefixRemovedPath
}
var gensetting models.TblGeneralSetting
gensetting.CompanyName = companyName
gensetting.LogoPath = imgPath
// gensetting.ExpandLogoPath = imgPath
gensetting.DateFormat = dateFormat
fmt.Println("dateFormat", gensetting.DateFormat)
gensetting.TimeFormat = timeForamt
gensetting.TimeZone = timezone
gensetting.LanguageId = languagedefault
models.SetDefaultLang(gensetting.LanguageId, 0, TenantId)
gensetting.ModifiedBy = c.GetInt("userid")
gensetting.ModifiedOn, _ = time.Parse("2006-01-02 15:04:05", time.Now().In(TZONE).Format("2006-01-02 15:04:05"))
gensetting.StorageType = storageType.SelectedType
err = models.UpdateGeneralSettings(gensetting, TenantId)
if err != nil {
ErrorLog.Println(err)
// c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
// c.Redirect(301, "/settings/general-settings/")
response["status"] = 0
c.AbortWithStatusJSON(500, response)
return
}
SetTimeZone(timezone)
Datelayout = DateFormater(dateFormat, timeForamt)
CurrentLanugageId = languagedefault
c.SetCookie("lang", string(languagedefault), 3600, "", "", false, false)
// LogoPath = imagePath1
ExpantLogoPath = expandimagePath
// c.SetCookie("get-toast", "General Settings Updated Successfully", 3600, "", "", false, false)
// c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
// c.Redirect(301, "/settings/general-settings/")
response["status"] = 1
c.JSON(200, response)
}
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
+740
View File
@@ -0,0 +1,740 @@
package controllers
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"path/filepath"
"strconv"
"strings"
"github.com/gin-gonic/gin"
"github.com/spurtcms/auth"
chn "github.com/spurtcms/channels"
listing "github.com/spurtcms/listing"
menu "github.com/spurtcms/menu"
csrf "github.com/utrack/gin-csrf"
"gopkg.in/yaml.v2"
)
type TemplateInfo struct {
TemplateName string `yaml:"template_name"`
TemplateImage string `yaml:"template_image"`
Description string `yaml:"description"`
Type string `yaml:"type"`
Channel string `yaml:"channel"`
HtmlTemplates string `yaml:"html_templates"`
}
func WebsiteList(c *gin.Context) {
var (
limt int
offset int
filter menu.Filter
)
limit := c.Query("limit")
pageno, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
filter.Keyword = strings.Trim(c.DefaultQuery("keyword", ""), " ")
filter.Status = strings.Trim(c.DefaultQuery("status", ""), " ")
filter.ToDate = strings.Trim(c.DefaultQuery("lastupdated", ""), " ")
var filterflag bool
if filter.Keyword != "" {
filterflag = true
} else {
filterflag = false
}
fmt.Println(filterflag)
if limit == "" {
limt = Limit
} else {
limt, _ = strconv.Atoi(limit)
}
if pageno != 0 {
offset = (pageno - 1) * limt
}
permisison, perr := NewAuth.IsGranted("Menu", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("menu authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("Menu authorization error")
c.Redirect(301, "/403-page")
return
}
channelslist, _, err := ChannelConfig.ListChannel(chn.Channels{Limit: 100, Offset: 0, IsActive: false, TenantId: TenantId})
if err != nil {
fmt.Println(err)
}
goTemplateList, err := ReadYamlFile("websites/themes")
if err != nil {
fmt.Println("Failed to read YAML files:", err)
}
host := c.Request.Host
isLocal := false
if strings.Contains(host, "localhost") {
isLocal = true
}
baseurl := os.Getenv("BASE_URL")
baseurl = strings.TrimPrefix(baseurl, "https://")
baseurl = strings.TrimPrefix(baseurl, "http://")
baseurl = strings.TrimSuffix(baseurl, "/")
var FinalwebsiteList []menu.TblWebsite
websitelist, count, err := MenuConfig.WebsiteList(limt, offset, menu.Filter{Keyword: filter.Keyword}, TenantId)
for _, val := range websitelist {
val.CreatedDate = val.CreatedOn.In(TZONE).Format(Datelayout)
if !val.ModifiedOn.IsZero() {
val.DateString = val.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
val.DateString = val.CreatedOn.In(TZONE).Format(Datelayout)
}
if strings.Contains(host, "localhost") {
val.Subdomain = "http://" + val.Name + "." + baseurl
} else {
val.Subdomain = "https://" + val.Name + "." + baseurl
}
FinalwebsiteList = append(FinalwebsiteList, val)
}
go_template_default, _ := c.Get("go_template_default")
webbanner, _ := c.Cookie("webbanner")
if webbanner == "" {
webbanner = "true"
}
webbanner = "true"
ModuleName, _, _ := ModuleRouteName(c)
translate, _ := TranslateHandler(c)
//pagination calc
paginationendcount := len(websitelist) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(pageno, int(count), limt)
c.HTML(200, "websitelist.html", gin.H{"Pagination": PaginationData{
NextPage: pageno + 1,
PreviousPage: pageno - 1,
TotalPages: PageCount,
TwoAfter: pageno + 2,
TwoBelow: pageno - 2,
ThreeAfter: pageno + 3},
"csrf": csrf.GetToken(c),
"webbanner": webbanner,
"Menu": NewMenuController(c),
"linktitle": "Website",
"translate": translate,
"title": ModuleName,
"baseurl": baseurl,
"go_template_default": go_template_default,
"channelslist": channelslist,
"templatelist": goTemplateList,
"count": count,
"websitelist": FinalwebsiteList,
"isLocal": isLocal,
"baseurlpath": os.Getenv("BASE_URL"),
"Count": count, "Limit": limt, "Paginationendcount": paginationendcount, "Previous": Previous, "Next": Next, "PageCount": PageCount, "CurrentPage": pageno, "Page": Page, "Filter": filter, "Paginationstartcount": paginationstartcount,
})
}
func BrowseTheme(c *gin.Context) {
var (
limt int
offset int
filter menu.Filter
)
limit := c.Query("limit")
if limit == "" {
limt = Limit
} else {
limt, _ = strconv.Atoi(limit)
}
pageno, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
filter.Keyword = strings.Trim(c.DefaultQuery("keyword", ""), " ")
filter.Status = strings.Trim(c.DefaultQuery("status", ""), " ")
filter.ToDate = strings.Trim(c.DefaultQuery("lastupdated", ""), " ")
var filterflag bool
if filter.Keyword != "" {
filterflag = true
} else {
filterflag = false
}
fmt.Println(filterflag)
if limit == "" {
limt = Limit
} else {
limt, _ = strconv.Atoi(limit)
}
if pageno != 0 {
offset = (pageno - 1) * limt
}
goTemplateList, err := ReadYamlFile("websites/themes")
if err != nil {
fmt.Println("Failed to read YAML files:", err)
c.AbortWithStatus(http.StatusInternalServerError)
return
}
// get pagination theme list
start := (pageno - 1) * limt
end := start + limt
total := len(goTemplateList)
if start > total {
start = total
}
if end > total {
end = total
}
paginatedList := goTemplateList[start:end]
webbanner, _ := c.Cookie("webbanner")
if webbanner == "" {
webbanner = "true"
}
ModuleName, _, _ := ModuleRouteName(c)
translate, _ := TranslateHandler(c)
// Get website_id from query param
websiteId, _ := strconv.Atoi(c.Query("website_id"))
Dataid := os.Getenv("WEBSITE_DATA_ID")
websiteId, _ = strconv.Atoi(Dataid) // Fetch single website by ID — only if websiteId is valid
var websiteInfo menu.TblWebsite
if websiteId != 0 {
websiteInfo, err = MenuConfig.GetWebsiteById(websiteId, TenantId)
if err != nil {
fmt.Println("Failed to get website:", err)
}
}
// get template details
templatedetails, _ := MenuConfig.GetTemplateById(websiteInfo.TemplateId, TenantId)
// Find matching template detail
var templateDetail TemplateInfo
for _, t := range goTemplateList {
if t.TemplateName == websiteInfo.TemplateName {
templateDetail = t
break
}
}
// fallback to first template if no match
if templateDetail.TemplateName == "" && len(goTemplateList) > 0 {
templateDetail = goTemplateList[0]
}
var FinalwebsiteList []menu.TblWebsite
websitelist, _, err := MenuConfig.WebsiteList(limt, offset, menu.Filter{Keyword: filter.Keyword}, TenantId)
UserDetails, _, _ := NewTeam.GetUserById(websiteInfo.CreatedBy, []int{})
baseurl := os.Getenv("BASE_URL")
baseurl = strings.TrimPrefix(baseurl, "https://")
baseurl = strings.TrimPrefix(baseurl, "http://")
baseurl = strings.TrimSuffix(baseurl, "/")
host := c.Request.Host
isLocal := false
var data menu.TblWebsite
for _, val := range websitelist {
val.CreatedDate = val.CreatedOn.In(TZONE).Format(Datelayout)
if !val.ModifiedOn.IsZero() {
val.DateString = val.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
val.DateString = val.CreatedOn.In(TZONE).Format(Datelayout)
}
if strings.Contains(host, "localhost") {
val.Subdomain = "http://" + val.Name + "." + baseurl
} else {
val.Subdomain = "https://" + val.Name + "." + baseurl
}
FinalwebsiteList = append(FinalwebsiteList, val)
data = val
}
//pagination calc
paginationendcount := end
paginationstartcount := start
Previous, Next, PageCount, Page := Pagination(pageno, len(goTemplateList), limt)
Allwidget, _, err := MenuConfig.GetWidgetList(limt, offset, menu.Filter{Keyword: filter.Keyword, Status: filter.Status, ToDate: filter.ToDate}, TenantId, 1)
websitdataid := os.Getenv("WEBSITE_DATA_ID")
url := os.Getenv("BASE_URL")
c.HTML(200, "browsetheme.html", gin.H{"Pagination": PaginationData{
NextPage: pageno + 1,
PreviousPage: pageno - 1,
TotalPages: PageCount,
TwoAfter: pageno + 2,
TwoBelow: pageno - 2,
ThreeAfter: pageno + 3,
},
"Menu": NewMenuController(c),
"translate": translate,
"linktitle": "Browse theme",
"title": ModuleName,
"csrf": csrf.GetToken(c),
"templatelist": paginatedList,
"templatedetail": templatedetails,
"website": websiteInfo,
"webbanner": webbanner,
"isLocal": isLocal,
"websitelist": FinalwebsiteList,
"web": data,
"websitedataid": websitdataid,
"Allwidgets": Allwidget,
"UserDetails": UserDetails,
"Url": url,
"Count": len(goTemplateList), "Paginationendcount": paginationendcount, "Previous": Previous, "Next": Next, "PageCount": PageCount, "CurrentPage": pageno, "Page": Page, "Filter": filter, "Paginationstartcount": paginationstartcount, "Limit": limt,
})
}
func Configuration(c *gin.Context) {
tempid := c.Param("template")
templateid, _ := strconv.Atoi(tempid)
template, _ := MenuConfig.GetTemplateById(templateid, TenantId)
templateName := template.TemplateName
if templateName == "" {
c.AbortWithStatus(http.StatusBadRequest)
return
}
var (
limt int
offset int
filter menu.Filter
)
limit := c.Query("limit")
if limit == "" {
limt = Limit
} else {
limt, _ = strconv.Atoi(limit)
}
pageno, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
filter.Keyword = strings.Trim(c.DefaultQuery("keyword", ""), " ")
filter.Status = strings.Trim(c.DefaultQuery("status", ""), " ")
filter.ToDate = strings.Trim(c.DefaultQuery("lastupdated", ""), " ")
var filterflag bool
if filter.Keyword != "" {
filterflag = true
} else {
filterflag = false
}
fmt.Println(filterflag)
if limit == "" {
limt = Limit
} else {
limt, _ = strconv.Atoi(limit)
}
if pageno != 0 {
offset = (pageno - 1) * limt
}
websiteId, _ := strconv.Atoi(c.Query("website_id"))
websiteInfo, err := MenuConfig.GetWebsiteById(websiteId, TenantId)
if err != nil {
fmt.Println("Failed to get website:", err)
c.AbortWithStatus(http.StatusInternalServerError)
return
}
webbanner, _ := c.Cookie("webbanner")
if webbanner == "" {
webbanner = "true"
}
ModuleName, _, _ := ModuleRouteName(c)
translate, _ := TranslateHandler(c)
var FinalwebsiteList []menu.TblWebsite
websitelist, _, err := MenuConfig.WebsiteList(limt, offset, menu.Filter{Keyword: filter.Keyword}, TenantId)
baseurl := os.Getenv("BASE_URL")
baseurl = strings.TrimPrefix(baseurl, "https://")
baseurl = strings.TrimPrefix(baseurl, "http://")
baseurl = strings.TrimSuffix(baseurl, "/")
host := c.Request.Host
isLocal := false
var data menu.TblWebsite
for _, val := range websitelist {
val.CreatedDate = val.CreatedOn.In(TZONE).Format(Datelayout)
if !val.ModifiedOn.IsZero() {
val.DateString = val.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
val.DateString = val.CreatedOn.In(TZONE).Format(Datelayout)
}
if strings.Contains(host, "localhost") {
val.Subdomain = "http://" + val.Name + "." + baseurl
} else {
val.Subdomain = "https://" + val.Name + "." + baseurl
}
FinalwebsiteList = append(FinalwebsiteList, val)
data = val
}
data.TemplateName = template.TemplateName
var Allwidgetlist []menu.TblWidgets
Allwidget, totalwidgetCount, err := MenuConfig.GetWidgetList(limt, offset, menu.Filter{Keyword: filter.Keyword, Status: filter.Status, ToDate: filter.ToDate}, TenantId, templateid)
for _, val := range Allwidget {
val.CreatedDate = val.CreatedOn.In(TZONE).Format(Datelayout)
if !val.ModifiedOn.IsZero() {
val.CreatedDate = val.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
val.CreatedDate = val.CreatedOn.In(TZONE).Format(Datelayout)
}
Allwidgetlist = append(Allwidgetlist, val)
}
channelist, _, clerr := ChannelConfig.ListChannel(chn.Channels{Limit: 100, Offset: 0, IsActive: true, TenantId: TenantId})
if clerr != nil {
ErrorLog.Printf("channellist error :%s", clerr)
}
Categorylist, _ := CategoryConfig.AllCategoriesWithSubList(TenantId)
Entrylist, _, _, _ := ChannelConfig.ChannelEntriesList(chn.Entries{Status: "Published"}, TenantId)
pagelist, _, err := MenuConfig.GetTemplatePageList(100, 0, menu.Filter{Status: "Active"}, TenantId, 0)
listinglist, _, err := ListingConfig.ListingsList(100, 0, listing.Filter{}, TenantId)
paginationendcount := len(Allwidgetlist) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(pageno, int(totalwidgetCount), limt)
UserDetails, _, _ := NewTeam.GetUserById(websiteInfo.CreatedBy, []int{})
c.HTML(200, "configure.html", gin.H{
"hideCancelBtn": true,
"Menu": NewMenuController(c),
"translate": translate,
"linktitle": "Widgets",
"title": ModuleName,
"csrf": csrf.GetToken(c),
"templatedetail": template,
"webbanner": webbanner,
"website": websiteInfo,
"isLocal": isLocal,
"UserDetails": UserDetails,
"websitelist": FinalwebsiteList,
"web": data,
"Allwidget": Allwidgetlist,
"templateid": templateid,
"Categorylist": Categorylist, "channelist": channelist, "listinglist": listinglist, "Entrylist": Entrylist, "pagelist": pagelist,
"Filter": filter,
"tabactive": "widgets",
"Searchtrue": filterflag,
"Count": totalwidgetCount,
"Limit": limt,
"Pagination": PaginationData{
NextPage: pageno + 1,
PreviousPage: pageno - 1,
TotalPages: PageCount,
TwoAfter: pageno + 2,
TwoBelow: pageno - 2,
ThreeAfter: pageno + 3,
},
"Paginationendcount": paginationendcount,
"Paginationstartcount": paginationstartcount,
"Previous": Previous,
"Next": Next,
"PageCount": PageCount,
"CurrentPage": pageno,
"Page": Page,
})
}
func ReadYamlFile(path string) ([]TemplateInfo, error) {
var allTemplateInfos []TemplateInfo
themes, err := os.ReadDir(path)
if err != nil {
return nil, err
}
for _, theme := range themes {
if !theme.IsDir() {
continue
}
themeDir := filepath.Join(path, theme.Name())
files, err := ioutil.ReadDir(themeDir)
if err != nil {
log.Println("Error reading theme dir:", themeDir, err)
continue
}
for _, file := range files {
if file.IsDir() || filepath.Ext(file.Name()) != ".yaml" {
continue
}
data, err := ioutil.ReadFile(filepath.Join(themeDir, file.Name()))
if err != nil {
log.Println("Error reading file:", file.Name(), err)
continue
}
var TemplateInfo TemplateInfo
if err := yaml.Unmarshal(data, &TemplateInfo); err != nil {
log.Println("Error parsing YAML:", file.Name(), err)
continue
}
allTemplateInfos = append(allTemplateInfos, TemplateInfo)
}
}
return allTemplateInfos, nil
}
func ReadYamlFileForWebsite(path string, templateName string) (TemplateInfo, error) {
var templateInfo TemplateInfo
themeDir := filepath.Join(path, templateName)
entries, err := os.ReadDir(themeDir)
if err != nil {
return templateInfo, err
}
for _, entry := range entries {
if entry.IsDir() || filepath.Ext(entry.Name()) != ".yaml" {
continue
}
data, err := os.ReadFile(filepath.Join(themeDir, entry.Name()))
if err != nil {
return templateInfo, err
}
if err := yaml.Unmarshal(data, &templateInfo); err != nil {
return templateInfo, err
}
// Return on first valid YAML file
return templateInfo, nil
}
return templateInfo, fmt.Errorf("no yaml file found in %s", themeDir)
}
//Create Website Function//
func CreateWebsite(c *gin.Context) {
sitename := c.PostForm("site_name")
channelname := c.PostForm("channel_name")
template_name := c.PostForm("template_name")
template_desc := c.PostForm("template_desc")
template_image := c.PostForm("template_img")
template_channel := c.PostForm("template_type")
// templateid, _ := strconv.Atoi(c.PostForm("template_id"))
userid := c.GetInt("userid")
fmt.Println(sitename, channelname, template_name, "checkdata")
temp := menu.TblGoTemplates{
TemplateName: template_name,
TemplateDescription: template_desc,
TemplateImage: template_image,
IsDeleted: 0,
TenantId: TenantId,
CreatedBy: userid,
ChannelSlugName: template_channel,
}
templateinfo, _ := MenuConfig.CreateTemplate(temp)
websiteinfo := menu.TblWebsite{
Name: sitename,
ChannelNames: channelname,
TemplateId: templateinfo.Id,
CreatedBy: userid,
TenantId: TenantId,
IsDeleted: 0,
Status: 0,
}
web, err1 := MenuConfig.CreateWebsite(websiteinfo)
if err1 != nil {
fmt.Println(err1)
}
_, errFooter := MenuConfig.CreateMenus(menu.MenuCreate{
MenuName: "Footer",
Description: "The menu at the bottom of the webpage, commonly listing support, privacy, and contact pages",
MenuSlug: "footer",
Status: 1,
ParentId: 0,
TenantId: TenantId,
CreatedBy: userid,
WebsiteId: web.Id,
})
if errFooter != nil {
fmt.Println(errFooter)
}
_, errHeader := MenuConfig.CreateMenus(menu.MenuCreate{
MenuName: "Headers",
Description: "The primary menu at the top of a webpage, guiding users to major site sections",
MenuSlug: "headers",
Status: 1,
ParentId: 0,
TenantId: TenantId,
CreatedBy: userid,
WebsiteId: web.Id,
})
if errHeader != nil {
fmt.Println(errHeader)
}
_, erraside := MenuConfig.CreateMenus(menu.MenuCreate{
MenuName: "Aside",
Description: "The primary menu at the left of a webpage, guiding users to major site sections",
MenuSlug: "aside",
Status: 1,
ParentId: 0,
TenantId: TenantId,
CreatedBy: userid,
WebsiteId: web.Id,
})
if erraside != nil {
fmt.Println(errHeader)
}
c.SetCookie("get-toast", "Website Created Successfully", 3600, "", "", false, false)
c.Redirect(301, "/admin/website/")
}
func UpdateWebsite(c *gin.Context) {
webid, _ := strconv.Atoi(c.PostForm("website_id"))
sitename := c.PostForm("site_name")
channelname := c.PostForm("channel_name")
template_id, _ := strconv.Atoi(c.PostForm("template_id"))
template_name := c.PostForm("template_name")
template_desc := c.PostForm("template_desc")
template_image := c.PostForm("template_img")
template_channel := c.PostForm("template_type")
userid := c.GetInt("userid")
var templateid int
temp := menu.TblGoTemplates{
TemplateName: template_name,
TemplateDescription: template_desc,
TemplateImage: template_image,
IsDeleted: 0,
TenantId: TenantId,
CreatedBy: userid,
ChannelSlugName: template_channel,
}
if template_id == 0 {
templateinfo, _ := MenuConfig.CreateTemplate(temp)
templateid = templateinfo.Id
} else {
templateid = template_id
}
websiteinfo := menu.TblWebsite{
Id: webid,
Name: sitename,
ChannelNames: channelname,
TemplateId: templateid,
ModifiedBy: userid,
TenantId: TenantId,
}
_, err1 := MenuConfig.UpdateWebsite(websiteinfo)
if err1 != nil {
fmt.Println(err1)
}
c.SetCookie("get-toast", "Theme Updated Successfully", 3600, "", "", false, false)
c.Redirect(301, "/admin/browsetheme/")
}
func DeleteWebsite(c *gin.Context) {
websiteid, _ := strconv.Atoi(c.Param("id"))
pageno := c.Query("page")
var url string
if pageno != "" {
url = "/admin/website/?page=" + pageno
} else {
url = "/admin/website/"
}
userid := c.GetInt("userid")
permisison, perr := NewAuth.IsGranted("Menu", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("Delete authorization error: %s", perr)
}
if !permisison {
c.Redirect(301, "/403-page")
return
}
err := MenuConfig.DeleteWebsite(websiteid, userid, TenantId)
if err != nil {
ErrorLog.Printf("Delete error: %s", perr)
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
return
}
c.SetCookie("get-toast", "Website Deleted Successfully", 3600, "", "", false, false)
c.Redirect(http.StatusMovedPermanently, url)
}
func CheckSiteName(c *gin.Context) {
subdomain := c.PostForm("sitename")
id, _ := strconv.Atoi(c.PostForm("webid"))
err := MenuConfig.CheckSiteName(subdomain, id)
if err != nil {
c.JSON(200, false)
return
}
c.JSON(200, true)
}
+280
View File
@@ -0,0 +1,280 @@
package controllers
import (
"crypto/rand"
"encoding/base64"
"encoding/json"
"fmt"
"net/http"
"os"
"spurt-cms/models"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
csrf "github.com/utrack/gin-csrf"
)
func GraphqlTokenApi(c *gin.Context) {
var limt, offset int
keyword := strings.TrimSpace(c.Request.URL.Query().Get("keyword"))
//get values from html form data
limit := c.Query("limit")
pageno, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
if limit == "" {
limt = Limit
} else {
limt, _ = strconv.Atoi(limit)
}
if pageno != 0 {
offset = (pageno - 1) * limt
}
var lists []models.TblGraphqlSettings
list, count, err := models.GetListOfTokens(limt, offset, keyword, TenantId)
if err != nil {
ErrorLog.Printf("get the list token error: %s", err)
}
for _, val := range list {
if !val.ModifiedOn.IsZero() {
val.DateString = val.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
val.DateString = val.CreatedOn.In(TZONE).Format(Datelayout)
}
lists = append(lists, val)
}
var paginationendcount = len(lists) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(pageno, int(count), limt)
menu := NewMenuController(c)
translate, _ := TranslateHandler(c)
c.HTML(200, "graphql.html", gin.H{"csrf": csrf.GetToken(c), "HeadTitle": "Graphql Settings", "linktitle": "Graphql API", "Menu": menu, "translate": translate, "SettingsHead": true, "Graphqlmenu": true, "title": "Graphql Api", "Tokens": lists, "totalcount": count, "Previous": Previous, "Next": Next, "PageCount": PageCount, "CurrentPage": pageno, "Page": Page, "Limit": limt, "filter": keyword, "Paginationendcount": paginationendcount, "Paginationstartcount": paginationstartcount, "Pagination": PaginationData{
NextPage: pageno + 1,
PreviousPage: pageno - 1,
TotalPages: PageCount,
TwoAfter: pageno + 2,
TwoBelow: pageno - 2,
ThreeAfter: pageno + 3,
}})
}
func CreateTokenGrapqhl(c *gin.Context) {
menu := NewMenuController(c)
translate, _ := TranslateHandler(c)
c.HTML(200, "graphql-manage.html", gin.H{"csrf": csrf.GetToken(c), "HeadTitle": "Graphql Settings", "Menu": menu, "translate": translate, "SettingsHead": true, "Graphqlmenu": true, "title": "Graphql Api", "CreateForm": true})
}
func CreateToken(c *gin.Context) {
var graphql models.TblGraphqlSettings
response := make(gin.H)
graphql.TokenName = c.PostForm("tokenName")
apiToken, err := GenerateApiToken(64)
if err != nil {
ErrorLog.Printf("genereate token error: %v", err)
response["token"] = ""
response["status"] = 0
c.AbortWithStatusJSON(500, response)
return
}
graphql.Token = apiToken
graphql.Description = c.PostForm("tokenDesc")
graphql.Duration = c.PostForm("duration")
graphql.CreatedOn, _ = time.Parse("2006-01-02 15:04:05", time.Now().UTC().Format("2006-01-02 15:04:05"))
graphql.CreatedBy = c.GetInt("userid")
graphql.TenantId = TenantId
if graphql.Duration == "7 Days" {
graphql.ExpiryTime, _ = time.Parse("2006-01-02 15:04:05", time.Now().AddDate(0, 0, 7).Format("2006-01-02 15:04:05"))
} else if graphql.Duration == "15 Days" {
graphql.ExpiryTime, _ = time.Parse("2006-01-02 15:04:05", time.Now().AddDate(0, 0, 15).Format("2006-01-02 15:04:05"))
} else if graphql.Duration == "30 Days" {
graphql.ExpiryTime, _ = time.Parse("2006-01-02 15:04:05", time.Now().AddDate(0, 0, 30).Format("2006-01-02 15:04:05"))
}
err = models.CreateApiToken(graphql)
if err != nil {
ErrorLog.Printf("create token error: %s", err)
response["token"] = ""
response["status"] = 0
c.AbortWithStatusJSON(500, response)
return
}
response["token"] = apiToken
response["status"] = 1
c.JSON(200, response)
}
func UpdateGraphqlApi(c *gin.Context) {
id, _ := strconv.Atoi(c.Param("id"))
token, err := models.GetTokenDetailsById(id, TenantId)
if err != nil {
ErrorLog.Printf("get token by id error: %s", err)
}
c.JSON(http.StatusOK, gin.H{"data": token})
}
func UpdateGraphqlToken(c *gin.Context) {
var id, _ = strconv.Atoi(c.PostForm("id"))
var graphql = make(map[string]interface{})
graphql["token_name"] = c.Request.FormValue("tokenName")
graphql["description"] = c.Request.FormValue("tokenDesc")
graphql["duration"] = c.Request.FormValue("duration")
graphql["modified_on"], _ = time.Parse("2006-01-02 15:04:05", time.Now().UTC().Format("2006-01-02 15:04:05"))
graphql["modified_by"] = c.GetInt("userid")
var dur = c.Request.FormValue("duration")
if dur == "7 Days" {
graphql["expiry_time"], _ = time.Parse("2006-01-02 15:04:05", time.Now().AddDate(0, 0, 7).Format("2006-01-02 15:04:05"))
} else if dur == "15 Days" {
graphql["expiry_time"], _ = time.Parse("2006-01-02 15:04:05", time.Now().AddDate(0, 0, 15).Format("2006-01-02 15:04:05"))
} else if dur == "30 Days" {
graphql["expiry_time"], _ = time.Parse("2006-01-02 15:04:05", time.Now().AddDate(0, 0, 30).Format("2006-01-02 15:04:05"))
}
err := models.UpdateApiToken(graphql, id, TenantId)
if err != nil {
ErrorLog.Printf("create token error: %s", err)
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
} else {
c.SetCookie("get-toast", "Graphql Settings Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
}
}
func DeleteToken(c *gin.Context) {
var id, _ = strconv.Atoi(c.Param("id"))
fmt.Println("id", id)
var deletedon, _ = time.Parse("2006-01-02 15:04:05", time.Now().UTC().Format("2006-01-02 15:04:05"))
if err := models.DeleteApiToken(id, c.GetInt("userid"), deletedon, TenantId); err != nil {
ErrorLog.Printf("delete token error: %s", err)
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
} else {
c.SetCookie("get-toast", "Graphql Settings Deleted Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
}
c.Redirect(301, "/admin/graphql/")
}
func GenerateApiToken(length int) (string, error) {
b := make([]byte, length) // Create a slice to hold 32 bytes of random data
if _, err := rand.Read(b); err != nil { // Fill the slice with random data and handle any errors
return "", err // Return an empty string and the error if something went wrong
}
return base64.URLEncoding.EncodeToString(b), nil // Encode the random bytes to a URL-safe base64 string
}
//Multi Delete graphql api//
func MultiDeleteGraphqlToken(c *gin.Context) {
var tokenIds []string
var tokenIntIds []int
if err := json.Unmarshal([]byte(c.Request.PostFormValue("tokenids")), &tokenIds); err != nil {
ErrorLog.Printf("delete multiple entry error: %s", err)
}
for _, ids := range tokenIds {
intIds, _ := strconv.Atoi(ids)
tokenIntIds = append(tokenIntIds, intIds)
}
pageno := c.PostForm("page")
var url string
if pageno != "" {
url = "/admin/graphql/?page=" + pageno
} else {
url = "/admin/graphql/"
}
var graphql models.TblGraphqlSettings
graphql.IsDeleted = 1
graphql.DeletedBy = c.GetInt("userid")
graphql.DeletedOn, _ = time.Parse("2006-01-02 15:04:05", time.Now().UTC().Format("2006-01-02 15:04:05"))
err := models.MultiDeleteGraphqltoken(&graphql, tokenIntIds, TenantId)
if err != nil {
ErrorLog.Printf("Multiple graphqlapi delete error: %s", err)
c.JSON(200, gin.H{"value": false})
return
}
_, count, err := models.GetListOfTokens(0, 0, "", TenantId)
if err != nil {
ErrorLog.Printf("get the list token error: %s", err)
}
recordsPerPage := Limit
totalPages := (int(count) + recordsPerPage - 1) / recordsPerPage
currentPage := 1
if pageno != "" {
currentPage, _ = strconv.Atoi(pageno)
}
if currentPage > totalPages && totalPages > 0 {
url = "/admin/graphql?page=" + strconv.Itoa(totalPages)
}
c.JSON(200, gin.H{"value": true, "url": url})
c.SetCookie("get-toast", "Graphql Settings Deleted Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
}
func PlaygroundView(c *gin.Context) {
url := os.Getenv("GRAPHQL_URL")
menu := NewMenuController(c)
translate, _ := TranslateHandler(c)
c.HTML(http.StatusOK, "playground.html", gin.H{"url": url, "Menu": menu, "translate": translate, "title": "Graphql Playground", "linktitle": "Graphql Playground","Baseurl":"https://spurtcms.com/play/query"})
}
+501
View File
@@ -0,0 +1,501 @@
package controllers
import (
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"os"
"spurt-cms/models"
"strconv"
"time"
"github.com/gin-gonic/gin"
"github.com/stripe/stripe-go/v82"
csrf "github.com/utrack/gin-csrf"
"gorm.io/datatypes"
)
func MasterIntegrationList(c *gin.Context) {
var (
limitVal int
offset int
)
// Pagination
limit := c.Query("limit")
pageNo, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
if limit == "" {
limitVal = Limit
} else {
limitVal, _ = strconv.Atoi(limit)
}
if pageNo > 0 {
offset = (pageNo - 1) * limitVal
}
endURL := os.Getenv("MASTER_INTEGRATION_ENDPOINTURL")
if endURL == "" {
c.HTML(http.StatusInternalServerError, "error.html", gin.H{
"message": "MASTER_INTEGRATION_ENDPOINTURL not configured",
})
return
}
// Make GET request
req, err := http.NewRequest("GET", endURL, nil)
if err != nil {
c.HTML(http.StatusInternalServerError, "error.html", gin.H{"message": err.Error()})
return
}
query := req.URL.Query()
query.Add("limit", strconv.Itoa(limitVal))
query.Add("offset", strconv.Itoa(offset))
query.Add("page", strconv.Itoa(pageNo))
req.URL.RawQuery = query.Encode()
req.Header.Set("Accept", "application/json")
client := &http.Client{Timeout: 10 * time.Second}
resp, err := client.Do(req)
_, tabName, _ := ModuleRouteName(c)
masterConnect := true
var response MasterIntegrationResponse
if err != nil {
fmt.Println("❌ Connection error:", err)
masterConnect = false
} else {
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
fmt.Println("❌ Invalid response:", resp.StatusCode)
masterConnect = false
} else {
bodyBytes, _ := io.ReadAll(resp.Body)
if err := json.Unmarshal(bodyBytes, &response); err != nil {
fmt.Println("❌ JSON decode error:", err)
fmt.Println("Response:", string(bodyBytes))
masterConnect = false
} else {
fmt.Printf("✅ Parsed %d integrations\n", len(response.IntegrationList))
}
}
}
if !masterConnect {
response = MasterIntegrationResponse{
BlockCount: 0,
IntegrationList: []models.IntegrationView{},
}
}
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
// Render HTML
c.HTML(http.StatusOK, "masterintegration.html", gin.H{
"csrf": csrf.GetToken(c),
"Menu": menu,
"Count": response.BlockCount,
"title": "Integration",
"linktitle": "Integration",
"translate": translate,
"Tabmenu": tabName,
"Integration": response.IntegrationList,
})
}
// func MasterIntegrationList(c *gin.Context) {
// var (
// limt int
// offset int
// )
// limit := c.Query("limit")
// pageno, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
// if limit == "" {
// limt = Limit
// } else {
// limt, _ = strconv.Atoi(limit)
// }
// if pageno != 0 {
// offset = (pageno - 1) * limt
// }
// endurl := os.Getenv("MASTER_INTEGRATION_ENDPOINTURL")
// req, err := http.NewRequest("GET", endurl, nil)
// if err != nil {
// c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create request: " + err.Error()})
// return
// }
// query := req.URL.Query()
// query.Add("limit", strconv.Itoa(limt))
// query.Add("offset", strconv.Itoa(offset))
// query.Add("page", strconv.Itoa(pageno))
// req.URL.RawQuery = query.Encode()
// req.Header.Set("Content-Type", "application/json")
// req.Header.Set("Accept", "application/json")
// client := &http.Client{}
// resp, err := client.Do(req)
// _, TabName, _ := ModuleRouteName(c)
// masterconnect := true
// if err != nil || resp.StatusCode != http.StatusOK {
// fmt.Println("Error connecting to master server:", err)
// masterconnect = false
// } else {
// defer resp.Body.Close()
// }
// var responseData ResponseData
// fmt.Println("masterconnect:",masterconnect)
// if masterconnect {
// bodyBytes, err := io.ReadAll(resp.Body)
// if err == nil {
// fmt.Println("Error response:", err)
// resp.Body = io.NopCloser(bytes.NewBuffer(bodyBytes))
// err = json.NewDecoder(resp.Body).Decode(&responseData)
// if err != nil {
// masterconnect = false
// }
// } else {
// masterconnect = false
// }
// }
// fmt.Println("responseData::",responseData.IntegrationList)
// if !masterconnect {
// responseData = ResponseData{
// IntegrationList: []models.TblMstrIntegration{},
// BlockCount: 0,
// }
// }
// translate, _ := TranslateHandler(c)
// menu := NewMenuController(c)
// c.HTML(200, "masterintegration.html", gin.H{"csrf": csrf.GetToken(c), "Menu": menu, "Count": responseData.BlockCount, "title": "Integration", "linktitle": "Integration", "translate": translate, "Tabmenu": TabName, "Integration": responseData.IntegrationList})
// }
func PaymentIntgrationList(c *gin.Context) {
var viewData []models.IntegrationView
Integration, Total_Integration, _ := models.ListIntegration(TenantId, "")
for _, item := range Integration {
var wrapper struct {
Credentials models.Credentials `json:"credentials"`
}
if err := json.Unmarshal(item.Credentials, &wrapper); err != nil {
fmt.Println("❌ Unmarshal error:", err)
continue
}
stoarge := wrapper.Credentials
viewData = append(viewData, models.IntegrationView{
Id: item.Id,
Credentials: stoarge,
IsActive: item.IsActive,
IntegrationType: item.IntegrationType,
})
}
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
_, TabName, _ := ModuleRouteName(c)
c.HTML(200, "integration.html", gin.H{"csrf": csrf.GetToken(c), "Menu": menu, "title": "Integration", "linktitle": "Integration", "translate": translate, "Tabmenu": TabName, "IntegrationList": viewData, "Count": Total_Integration})
}
func AddIntegrationToCollection(c *gin.Context) {
Id, _ := strconv.Atoi(c.Query("Id"))
TenantId := c.GetString("tenant_id") // Make sure youve set this somewhere (middleware or session)
userId := c.GetInt("userid")
endURL := os.Getenv("MASTER_INTEGRATION_ENDPOINTURL")
queryURL := fmt.Sprintf("%s?id=%d", endURL, Id)
req, err := http.NewRequest("GET", queryURL, nil)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create request: " + err.Error()})
return
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
client := &http.Client{Timeout: 10 * time.Second}
resp, err := client.Do(req)
if err != nil {
fmt.Println("❌ Connection error:", err)
c.JSON(http.StatusBadGateway, gin.H{"error": "Failed to connect to master API"})
return
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
fmt.Println("❌ Invalid response:", resp.StatusCode)
c.JSON(http.StatusBadGateway, gin.H{"error": "Master API returned an invalid response"})
return
}
bodyBytes, _ := io.ReadAll(resp.Body)
// ✅ Expecting JSON like: { "integrationdetail": { ... } }
type MasterIntegrationDetailResponse struct {
IntegrationDetail models.IntegrationView `json:"integrationdetail"`
}
var response MasterIntegrationDetailResponse
if err := json.Unmarshal(bodyBytes, &response); err != nil {
fmt.Println("❌ JSON decode error:", err)
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to parse master integration JSON"})
return
}
masterData := response.IntegrationDetail
// ---- CHECK IF ALREADY EXISTS ----
exists, _ := models.CheckInterationReapt(masterData.Credentials.GatewayName, TenantId)
fmt.Println("exists", exists)
if exists {
c.SetCookie("Alert-msg", "Integrationreapt", 3600, "", "", false, false)
c.Redirect(301, "/admin/integration/master")
return
}
// ---- COMBINE PAYMENT & S3 JSON ----
combined := map[string]interface{}{
"credentials": masterData.Credentials,
}
combinedJSON, _ := json.Marshal(combined)
// ---- CREATE LOCAL INTEGRATION ----
now := time.Now().UTC()
newIntegration := models.TblIntegration{
Credentials: datatypes.JSON(combinedJSON),
IntegrationType: masterData.IntegrationType,
IsActive: 0,
CreatedBy: userId,
CreatedOn: now,
TenantId: TenantId,
}
if err := models.AddtoCollection(newIntegration); err != nil {
log.Println("❌ Error adding to collection:", err)
c.AbortWithError(500, err)
return
}
// ---- SUCCESS RESPONSE ----
c.SetCookie("get-toast", "Collection Added Successfully", 3600, "", "", false, false)
c.Redirect(301, "/admin/integration")
}
func IntegrationEdit(c *gin.Context) {
IntegrationId, _ := strconv.Atoi(c.DefaultQuery("id", ""))
EditIntegration, _ := models.EditIntegration(IntegrationId, TenantId)
c.JSON(200, gin.H{"Integration": EditIntegration})
}
func GetStripeValue(c *gin.Context) {
Getstripe, _ := models.GetStripeIntegration( TenantId)
c.JSON(200, gin.H{"Integration": Getstripe})
}
// func IntegrationEdit(c *gin.Context) {
// IntegrationId, _ := strconv.Atoi(c.DefaultQuery("id", ""))
// endurl := os.Getenv("MASTER_INTEGRATION_ENDPOINTURL")
// req, err := http.NewRequest("GET", endurl, nil)
// if err != nil {
// c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create request: " + err.Error()})
// return
// }
// query := req.URL.Query()
// query.Add("id", strconv.Itoa(IntegrationId))
// req.URL.RawQuery = query.Encode()
// req.Header.Set("Content-Type", "application/json")
// req.Header.Set("Accept", "application/json")
// client := &http.Client{}
// resp, err := client.Do(req)
// masterconnect := true
// if err != nil || resp.StatusCode != http.StatusOK {
// fmt.Println("Error connecting to master server:", err)
// masterconnect = false
// } else {
// defer resp.Body.Close()
// }
// type integrationres struct {
// Integraiondetail models.TblMstrIntegration `json:"integrationdetail"`
// }
// var responseData integrationres
// var bodyBytes []byte
// if masterconnect {
// bodyBytes, err = io.ReadAll(resp.Body)
// if err != nil {
// masterconnect = false
// fmt.Println("Error reading response body:", err)
// } else {
// err = json.Unmarshal(bodyBytes, &responseData)
// if err != nil {
// masterconnect = false
// fmt.Println("Error decoding JSON:", err)
// }
// }
// }
// if !masterconnect {
// responseData = integrationres{
// Integraiondetail: models.TblMstrIntegration{},
// }
// }
// // EditIntegration, _ := models.EditIntegration(IntegrationId, TenantId)
// c.JSON(200, gin.H{"Integration": responseData.Integraiondetail})
// }
func IntegrationManage(c *gin.Context) {
IntegrationType := c.PostForm("IntegrationType")
fmt.Println("IntegrationType", IntegrationType)
// Prepare credentials map
var creds map[string]interface{}
if IntegrationType == "Payment" {
creds = map[string]interface{}{
"access_key": c.PostForm("ClientId"), // optional: read from form
"secret_key": c.PostForm("ClientSecret"), // optional: read from form
"gateway_name": c.PostForm("GatewayName"),
"gateway_desc": c.PostForm("GatewayDesc"),
"dollar_to_rupees": c.PostForm("DollartoRupees"),
}
} else { // Storage
creds = map[string]interface{}{
"region": c.PostForm("Region"),
"access_key": c.PostForm("AccessKeyId"),
"secret_key": c.PostForm("SecretKey"),
"bucket_name": c.PostForm("BucketName"),
"gateway_name": c.PostForm("GatewayName"),
"gateway_desc": c.PostForm("GatewayDesc"),
}
}
// Marshal credentials map to JSON
CredentialsSON, err := json.Marshal(creds)
if err != nil {
fmt.Println("❌ Error marshalling credentials:", err)
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to process credentials"})
return
}
IntegrationId, _ := strconv.Atoi(c.PostForm("IntegrationId"))
userid := c.GetInt("userid")
isactive, _ := strconv.Atoi(c.PostForm("integration_activestatus"))
updatetime := time.Now().UTC()
// Build integration struct
UpdateIntegration := models.TblIntegration{
Id: IntegrationId,
Credentials: datatypes.JSON(CredentialsSON),
IntegrationType: IntegrationType,
IsActive: isactive,
ModifiedOn: updatetime,
ModifiedBy: userid,
}
// Call model function to save/update
if err := models.ManageIntegration(UpdateIntegration, TenantId); err != nil {
fmt.Println("❌ Error updating integration:", err)
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update integration"})
fmt.Println("err", err)
return
}
// Set success cookie and redirect
c.SetCookie("get-toast", "Integration Updated Successfully", 3600, "", "", false, false)
c.Redirect(301, "/admin/integration")
}
func HandleStripeWebhook(c *gin.Context) {
const MaxBodyBytes = int64(65536)
c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, MaxBodyBytes)
payload, err := io.ReadAll(c.Request.Body)
if err != nil {
c.String(http.StatusServiceUnavailable, "Error reading body")
return
}
var event stripe.Event
if err := json.Unmarshal(payload, &event); err != nil {
c.String(http.StatusBadRequest, "Invalid JSON")
return
}
switch event.Type {
case "checkout.session.completed":
var session stripe.CheckoutSession
if err := json.Unmarshal(event.Data.Raw, &session); err == nil {
fmt.Println("Payment Success:", session.ID)
if err != nil {
log.Fatal("Create Subscription Error :", err)
c.AbortWithError(500, err)
}
// storeToDB(session.ID, "success", session.CustomerEmail)
}
case "payment_intent.payment_failed":
var pi stripe.PaymentIntent
if err := json.Unmarshal(event.Data.Raw, &pi); err == nil {
fmt.Println("Payment Failed:", pi.ID)
// storeToDB(pi.ID, "failed", pi.ReceiptEmail)
}
case "payment_intent.processing":
var pi stripe.PaymentIntent
if err := json.Unmarshal(event.Data.Raw, &pi); err == nil {
fmt.Println("Payment Pending:", pi.ID)
// storeToDB(pi.ID, "pending", pi.ReceiptEmail)
}
default:
fmt.Println("Unhandled event type:", event.Type)
}
c.Status(http.StatusOK)
}
+708
View File
@@ -0,0 +1,708 @@
package controllers
import (
"log"
"spurt-cms/models"
"strconv"
"strings"
"github.com/gin-gonic/gin"
csrf "github.com/utrack/gin-csrf"
)
func LanguageList(c *gin.Context) {
var (
limit int
offset int
filter models.Filter
language1 []models.TblLanguage
language []models.TblLanguage
conv_language []models.TblLanguage
)
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
if c.Query("limit") == "" {
limit = Limit
} else {
limit, _ = strconv.Atoi(c.Query("limit"))
}
if page != 0 {
offset = (page - 1) * limit
}
filter.Keyword = strings.Trim(c.DefaultQuery("keyword", ""), " ")
flag := false
query.DataAccess = c.GetInt("dataaccess")
query.UserId = c.GetInt("userid")
_, Total_languages := query.GetLanguageList(&language1, 0, 0, filter, flag, TenantId)
query.GetLanguageList(&language, limit, offset, filter, flag, TenantId)
for _, language := range language {
// var default_lang models.TblLanguage
// models.GetLanguageById(&default_lang, CurrentLanugageId)
// if default_lang.Id == language.Id {
// language.DefaultLanguageId = default_lang.Id
// }
if language.ModifiedOn.IsZero() {
language.DateString = language.CreatedOn.In(TZONE).Format(Datelayout)
} else {
language.DateString = language.ModifiedOn.In(TZONE).Format(Datelayout)
}
if language.ImagePath != "" {
if !strings.Contains(language.ImagePath, "/public/img/") {
if language.StorageType == "local" {
language.ImagePath = "/" + language.ImagePath
} else if language.StorageType == "aws" {
language.ImagePath = "/image-resize?name=" + language.ImagePath
}
}
}
conv_language = append(conv_language, language)
}
paginationendcount := len(language) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(page, int(Total_languages), limit)
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
userDetails, _, err := NewTeamWP.GetUserById(c.GetInt("userid"), []int{})
if err != nil {
log.Println(err)
}
selectedtype, _ := GetSelectedType()
c.HTML(200, "language.html", gin.H{"Pagination": PaginationData{
NextPage: page + 1,
PreviousPage: page - 1,
TotalPages: PageCount,
TwoAfter: page + 2,
TwoBelow: page - 2,
ThreeAfter: page + 3,
}, "Menu": menu, "HeadTitle": translate.Language, "translate": translate, "csrf": csrf.GetToken(c), "Languages": conv_language, "Count": Total_languages, "Limit": limit, "Filter": filter, "UserDetails": userDetails, "Previous": Previous, "Next": Next, "Page": Page, "PageCount": PageCount, "CurrentPage": page, "Paginationendcount": paginationendcount, "Paginationstartcount": paginationstartcount, "Langmenu": true, "SettingsHead": true, "Languagecodearr": Lang_codearr, "title": "Languages", "linktitle": "Language", "Tooltiptitle": translate.Setting.Languagetooltip, "StorageType": selectedtype.SelectedType})
}
func SetDefaultLanguage(c *gin.Context) {
isDefault, err := strconv.Atoi(c.PostForm("isDefault"))
if err != nil {
c.SetCookie("lang", "", 3600, "", "", false, false)
}
langId, err := strconv.Atoi(c.PostForm("langId"))
if err != nil {
c.SetCookie("lang", "", 3600, "", "", false, false)
}
editedLang, err := models.SetDefaultLang(langId, isDefault, TenantId)
if err != nil {
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/languages/")
return
}
if editedLang.IsDefault == 1 {
models.UpdateLanuguageInGeneral(editedLang.Id, TenantId)
CurrentLanugageId = editedLang.Id
}
var defaultLang models.TblLanguage
err = models.GetDefaultLanguage(&defaultLang, c.GetInt("userid"), TenantId)
if err != nil {
c.SetCookie("lang", "", 3600, "", "", false, false)
} else {
conv_langId := strconv.Itoa(defaultLang.Id)
c.SetCookie("lang", conv_langId, 3600, "", "", false, false)
// if c.PostForm("lang_default") == conv_langId {
// c.SetCookie("lang", conv_langId, 3600, "", "", false, false)
// } else {
// c.SetCookie("lang", "", 3600, "", "", false, false)
// }
}
c.JSON(200, gin.H{"value": true})
}
// func AddLanguage(c *gin.Context) {
// if c.PostForm("flag_imgpath") == "" || c.PostForm("lang_name") == "" || c.PostForm("lang_code") == "" {
// c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
// c.Redirect(301, "/admin/languages/")
// return
// }
// var newlanguagedata models.TblLanguage
// //adding new lang json file to the code
// jsonfile, _ := c.FormFile("lang_json")
// ext := strings.Split(jsonfile.Filename, ".")[len(strings.Split(jsonfile.Filename, "."))-1]
// if ext == "json" {
// newlanguagedata.LanguageCode = c.PostForm("lang_code")
// json_dst := fmt.Sprintf("locales/%s", c.PostForm("lang_code")+"."+ext)
// newlanguagedata.JsonPath = json_dst
// c.SaveUploadedFile(jsonfile, json_dst)
// localjsondata, _ := os.Open(json_dst)
// var jsonData map[string]interface{}
// json.NewDecoder(localjsondata).Decode(&jsonData)
// }
// // get the selected type for image upload from the db
// storageType, err := GetSelectedType()
// if err != nil {
// ErrorLog.Println(err)
// ErrorLog.Printf("Add Language error: %s", err)
// c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
// c.Redirect(301, "/admin/languages/")
// return
// }
// var langDefault = c.PostForm("lang_default")
// if langDefault != "" {
// newlanguagedata.IsDefault, err = strconv.Atoi(langDefault)
// if err != nil {
// ErrorLog.Println(err)
// ErrorLog.Printf("Add Language error: %s", err)
// c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
// c.Redirect(301, "/admin/languages/")
// return
// }
// } else {
// newlanguagedata.IsDefault = 0
// }
// //getting the default lang value from the request
// //image processing according to the selected type
// langData := c.PostForm("flag_imgpath")
// if strings.Contains(langData, "data:image/jpeg;base64") || strings.Contains(langData, "data:image/png;base64") || strings.Contains(langData, "data:image/svg+xml;base64") {
// // image processing if the selected type is aws
// if storageType.SelectedType == "aws" {
// tenantDetails, err := NewTeam.GetTenantDetails(TenantId)
// if err != nil {
// ErrorLog.Println(err)
// ErrorLog.Printf("Add Language error: %s", err)
// c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
// c.Redirect(301, "/admin/languages/")
// return
// }
// var (
// tempString, imageName string
// imageByte []byte
// )
// imageName, tempString, imageByte, err = ConvertBase64toByte(langData, "lang")
// if err != nil {
// ErrorLog.Println(err)
// ErrorLog.Printf("Add Language error: %s", err)
// c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
// c.Redirect(301, "/admin/languages/")
// return
// }
// tempString = tenantDetails.S3FolderName + tempString
// err = storagecontroller.UploadCropImageS3(imageName, tempString, imageByte)
// if err != nil {
// ErrorLog.Println(err)
// ErrorLog.Printf("Add Language error: %s", err)
// c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
// c.Redirect(301, "/admin/languages/")
// return
// }
// newlanguagedata.ImagePath = tempString
// } else if storageType.SelectedType == "local" {
// // image processing if the selected type is local
// var tempImgPath string
// _, tempImgPath, err = ConvertBase64(langData, "storage/lang")
// if err != nil {
// ErrorLog.Println(err)
// ErrorLog.Printf("Add Language error: %s", err)
// c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
// c.Redirect(301, "/admin/languages/")
// return
// }
// newlanguagedata.ImagePath = "/" + tempImgPath
// }
// } else {
// newlanguagedata.ImagePath = langData
// }
// newlanguagedata.LanguageName = c.PostForm("lang_name")
// newlanguagedata.IsStatus = 1
// newlanguagedata.CreatedOn, _ = time.Parse("2006-01-02 15:04:05", time.Now().UTC().Format("2006-01-02 15:04:05"))
// newlanguagedata.CreatedBy = c.GetInt("userid")
// newlanguagedata.StorageType = storageType.SelectedType
// newlanguagedata.TenantId = TenantId
// err = models.AddNewLanguage(&newlanguagedata, c.GetInt("userid"))
// if err != nil {
// ErrorLog.Printf("Add Language error: %s", err)
// c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
// c.Redirect(301, "/admin/languages/")
// return
// }
// c.SetCookie("get-toast", "Language Added Successfully", 3600, "", "", false, false)
// c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
// c.Redirect(301, "/admin/languages/")
// }
// func EditLanguage(c *gin.Context) {
// languageId, _ := strconv.Atoi(c.Param("id"))
// userid := c.GetInt("userid")
// var language models.TblLanguage
// err := models.GetLanguageDetails(&language, languageId, userid, TenantId)
// if err != nil {
// log.Println(err)
// }
// if !strings.Contains(language.ImagePath, "/public/img/") {
// if language.ImagePath != "" {
// if language.StorageType == "local" {
// language.ImagePath = "/" + language.ImagePath
// } else if language.StorageType == "aws" {
// language.ImagePath = "/image-resize?name=" + language.ImagePath
// }
// }
// }
// language.DefaultLanguageId = CurrentLanugageId
// c.JSON(200, gin.H{"csrf": csrf.GetToken(c), "Language": language, "UploadUrl": "/admin/languages/updatelanguage", "Button": "Update"})
// }
// func UpdateLanguage(c *gin.Context) {
// if c.PostForm("lang_id") == "" || c.PostForm("lang_name") == "" {
// c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
// c.Redirect(301, "/admin/languages/")
// return
// }
// var editLanguage models.TblLanguage
// editLanguage.Id, _ = strconv.Atoi(c.PostForm("lang_id"))
// editLanguage.LanguageCode = c.PostForm("lang_code")
// editLanguage.IsDefault, _ = strconv.Atoi(c.PostForm("lang_default"))
// editLanguage.IsStatus, _ = strconv.Atoi(c.PostForm("lang_status"))
// editLanguage.LanguageName = c.PostForm("lang_name")
// editLanguage.ModifiedOn, _ = time.Parse("2006-01-02 15:04:05", time.Now().UTC().Format("2006-01-02 15:04:05"))
// editLanguage.ModifiedBy = c.GetInt("userid")
// // get the selected type for image upload from the db
// storageType, err := GetSelectedType()
// if err != nil {
// ErrorLog.Println(err)
// ErrorLog.Printf("Add Language error: %s", err)
// c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
// c.Redirect(301, "/admin/languages/")
// return
// }
// var tempImgPath string
// langData := c.PostForm("flag_imgpath")
// if strings.Contains(langData, "data:image/jpeg;base64") || strings.Contains(langData, "data:image/png;base64") || strings.Contains(langData, "data:image/svg+xml;base64") {
// if storageType.SelectedType == "aws" {
// tenantDetails, err := NewTeam.GetTenantDetails(TenantId)
// if err != nil {
// ErrorLog.Println(err)
// ErrorLog.Printf("Add Language error: %s", err)
// c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
// c.Redirect(301, "/admin/languages/")
// return
// }
// var (
// tempString, imageName string
// imageByte []byte
// )
// imageName, tempString, imageByte, err = ConvertBase64toByte(langData, "lang")
// if err != nil {
// ErrorLog.Println(err)
// ErrorLog.Printf("Add Language error: %s", err)
// c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
// c.Redirect(301, "/admin/languages/")
// return
// }
// tempString = tenantDetails.S3FolderName + tempString
// err = storagecontroller.UploadCropImageS3(imageName, tempString, imageByte)
// if err != nil {
// ErrorLog.Println(err)
// ErrorLog.Printf("Add Language error: %s", err)
// c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
// c.Redirect(301, "/admin/languages/")
// return
// }
// editLanguage.ImagePath = tempString
// } else if storageType.SelectedType == "local" {
// _, tempImgPath, err = ConvertBase64(langData, "storage/lang")
// if err != nil {
// ErrorLog.Println(err)
// ErrorLog.Printf("Add Language error: %s", err)
// c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
// c.Redirect(301, "/admin/languages/")
// return
// }
// editLanguage.ImagePath = "/" + tempImgPath
// }
// } else {
// prefixEndIndex := strings.Index(langData, "=")
// fmt.Println("prefix", prefixEndIndex)
// prefixRemovedPath := langData[prefixEndIndex+1:]
// fmt.Println("prefixRemoved", prefixRemovedPath)
// editLanguage.ImagePath = prefixRemovedPath
// }
// jsonFile, _ := c.FormFile("lang_json")
// if jsonFile != nil {
// ext := strings.Split(jsonFile.Filename, ".")[len(strings.Split(jsonFile.Filename, "."))-1]
// if ext == "json" {
// json_dst := fmt.Sprintf("locales/%s", c.PostForm("lang_code")+"."+ext)
// editLanguage.JsonPath = json_dst
// c.SaveUploadedFile(jsonFile, json_dst)
// localjsondata, _ := os.Open(json_dst)
// var jsonData map[string]interface{}
// json.NewDecoder(localjsondata).Decode(&jsonData)
// }
// } else {
// var languageData models.TblLanguage
// userid := c.GetInt("userid")
// err = models.GetLanguageDetails(&languageData, editLanguage.Id, userid, TenantId)
// if err != nil {
// log.Println(err)
// }
// editLanguage.JsonPath = languageData.JsonPath
// }
// editLanguage.StorageType = storageType.SelectedType
// err = models.UpdateLanguage(&editLanguage, c.GetInt("userid"), TenantId)
// if err != nil {
// c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
// c.Redirect(301, "/admin/languages/")
// return
// }
// if editLanguage.IsDefault == 1 {
// models.UpdateLanuguageInGeneral(editLanguage.Id, TenantId)
// CurrentLanugageId = editLanguage.Id
// }
// var default_lang models.TblLanguage
// err = models.GetDefaultLanguage(&default_lang, c.GetInt("userid"), TenantId)
// if err != nil {
// c.SetCookie("lang", "", 3600, "", "", false, false)
// } else {
// conv_langId := strconv.Itoa(default_lang.Id)
// if c.PostForm("lang_default") == conv_langId {
// c.SetCookie("lang", conv_langId, 3600, "", "", false, false)
// } else {
// c.SetCookie("lang", "", 3600, "", "", false, false)
// }
// }
// c.SetCookie("get-toast", "Language Updated Successfully", 3600, "", "", false, false)
// c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
// c.Redirect(301, "/admin/languages/")
// }
// func DeleteLanguage(c *gin.Context) {
// languageId, _ := strconv.Atoi(c.Param("id"))
// userid := c.GetInt("userid")
// var (
// default_lang models.TblLanguage
// language models.TblLanguage
// )
// err := models.GetDefaultLanguage(&default_lang, userid, TenantId)
// if err != nil {
// log.Println(err)
// }
// if languageId == default_lang.Id || languageId == 1 {
// c.SetCookie("Alert-msg", "DefaultLanguageNotAllowedToDelete", 3600, "", "", false, false)
// c.Redirect(301, "/admin/languages/")
// return
// }
// /*uncomment the below code to use for language json file delete purpose*/
// // var langData models.TblLanguage
// // models.GetLanguageById(&langData,languageId)
// // log.Println("language json delete path",langData.JsonPath)
// // err = os.Remove(langData.JsonPath)
// // if err != nil {
// // log.Println("Error deleting file:", err)
// // return
// // }
// // fmt.Println("language json deleted successfully!")
// language.Id = languageId
// language.IsDeleted = 1
// language.DeletedBy = c.GetInt("userid")
// language.DeletedOn, _ = time.Parse("2006-01-02 15:04:05", time.Now().UTC().Format("2006-01-02 15:04:05"))
// err = models.DeleteLanguage(&language, TenantId)
// if err != nil {
// ErrorLog.Printf("DeleteMultipleUser error: %s", err)
// c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
// return
// }
// c.SetCookie("get-toast", "Language Deleted Successfully", 3600, "", "", false, false)
// c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
// c.Redirect(301, "/admin/languages/")
// }
// func DownloadLanguage(c *gin.Context) {
// langId, _ := strconv.Atoi(c.Param("id"))
// var langData models.TblLanguage
// err := models.GetLanguageById(&langData, langId)
// if err != nil {
// log.Println(err)
// c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
// return
// }
// jsonData, err := ioutil.ReadFile(langData.JsonPath)
// if err != nil {
// log.Println(err)
// c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
// return
// }
// c.Header("Content-Disposition", "attachment; filename="+langData.LanguageName+"."+strings.Split(langData.JsonPath, ".")[1])
// c.Data(200, "application/json", jsonData)
// c.SetCookie("get-toast", "Language Json file Download Successfully", 3600, "", "", false, false)
// c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
// }
// func LanguageStatus(c *gin.Context) {
// var langData models.TblLanguage
// id, err := strconv.Atoi(c.Request.PostFormValue("id"))
// if err != nil {
// c.JSON(500, gin.H{"language": "", "status": false})
// }
// langData.IsStatus, _ = strconv.Atoi(c.Request.PostFormValue("isactive"))
// langData.ModifiedBy = c.GetInt("userid")
// langData.ModifiedOn, _ = time.Parse("2006-01-02 15:04:05", time.Now().UTC().Format("2006-01-02 15:04:05"))
// models.Languageisactive(&langData, id, TenantId)
// var language models.TblLanguage
// models.GetLanguageDetails(&language, id, c.GetInt("userid"), TenantId)
// c.JSON(200, gin.H{"language": language, "status": true})
// }
// // language name check
// func CheckLanguageName(c *gin.Context) {
// var chekclang models.TblLanguage
// name := c.PostForm("langname")
// id, _ := strconv.Atoi(c.PostForm("id"))
// err := models.Checklang(&chekclang, name, id, TenantId)
// if err != nil {
// ErrorLog.Printf("check language name error: %s", err)
// json.NewEncoder(c.Writer).Encode(false)
// return
// }
// json.NewEncoder(c.Writer).Encode(true)
// }
// func MultiselectLanguageDelete(c *gin.Context) {
// var languagedata []map[string]string
// if err := json.Unmarshal([]byte(c.Request.PostFormValue("languageids")), &languagedata); err != nil {
// ErrorLog.Printf("Multiple language delete unmarshall error: %s", err)
// }
// fmt.Println("languageData", languagedata)
// var languageids []int
// for _, val := range languagedata {
// languageid, _ := strconv.Atoi(val["languageId"])
// languageids = append(languageids, languageid)
// }
// fmt.Println("langaugeIds", languageids)
// var language models.TblLanguage
// language.IsDeleted = 1
// language.DeletedBy = c.GetInt("userid")
// language.DeletedOn, _ = time.Parse("2006-01-02 15:04:05", time.Now().UTC().Format("2006-01-02 15:04:05"))
// err := models.MultiSelectDeleteLanguage(&language, languageids, TenantId)
// if err != nil {
// ErrorLog.Printf("Multiple language delete error: %s", err)
// c.JSON(200, gin.H{"value": false})
// return
// }
// c.JSON(200, gin.H{"value": true, "url": "/admin/languages/"})
// }
// func MultiSelectLanguageStatus(c *gin.Context) {
// var (
// languagedata []map[string]string
// languageids []int
// statusint int
// status int
// )
// if err := json.Unmarshal([]byte(c.Request.PostFormValue("languageids")), &languagedata); err != nil {
// ErrorLog.Printf("Multiple language status change unmarshall error: %s", err)
// }
// for _, val := range languagedata {
// languageid, _ := strconv.Atoi(val["languageId"])
// statusint, _ = strconv.Atoi(val["status"])
// if statusint == 0 {
// status = 1
// } else if statusint == 1 {
// status = 0
// }
// languageids = append(languageids, languageid)
// }
// var langData models.TblLanguage
// langData.IsStatus = status
// langData.ModifiedBy = c.GetInt("userid")
// langData.ModifiedOn, _ = time.Parse("2006-01-02 15:04:05", time.Now().UTC().Format("2006-01-02 15:04:05"))
// err := models.MultiSelectLanguageisactive(&langData, languageids, TenantId)
// if err != nil {
// ErrorLog.Printf("Multiple language status change error: %s", err)
// c.JSON(200, gin.H{"value": false})
// return
// }
// c.JSON(200, gin.H{"value": true, "status": status, "url": "/admin/languages/"})
// }
+795
View File
@@ -0,0 +1,795 @@
package controllers
import (
"bytes"
"encoding/json"
"fmt"
"image"
"image/gif"
"image/jpeg"
"image/png"
"net/http"
"path"
"path/filepath"
"sort"
"spurt-cms/models"
storagecontroller "spurt-cms/storage-controller"
"strconv"
"strings"
"time"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/gin-gonic/gin"
"github.com/nfnt/resize"
csrf "github.com/utrack/gin-csrf"
)
type medias struct {
File bool
Name string
Path string
ModTime time.Time
TotalSubMedia int
}
// var StorageType = os.Getenv("STORAGE_TYPE")
func GetSelectedType() (storagetyp models.TblStorageType, err error) {
storagetype, err := models.GetStorageValue(TenantId)
if err != nil {
fmt.Println(err)
return models.TblStorageType{}, err
}
return storagetype, nil
}
func MediaList(c *gin.Context) {
var (
limt int
offset int
)
//get data from html url query
limit := c.Query("limit")
pageno, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
if limit == "" {
limt = 40
} else {
limt, _ = strconv.Atoi(limit)
}
if pageno != 0 {
offset = (pageno - 1) * limt
}
search := strings.TrimSpace(c.Query("keyword"))
menu := NewMenuController(c)
translate, _ := TranslateHandler(c)
_, _, Media, nextcont, _ := GetMedia1(search, "")
Folder, File, _ := S3ArrPagination(Media, limt, offset)
ModuleName, TabName, _ := ModuleRouteName(c)
selectedtype, _ := GetSelectedType()
var paginationendcount = len(Folder) + len(File) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(pageno, int(len(Media)), limt)
c.HTML(200, "media.html", gin.H{"Menu": menu, "Pagination": PaginationData{
NextPage: pageno + 1,
PreviousPage: pageno - 1,
TotalPages: PageCount,
TwoAfter: pageno + 2,
TwoBelow: pageno - 2,
ThreeAfter: pageno + 3}, "title": ModuleName, "csrf": csrf.GetToken(c), "translate": translate, "Folder": Folder, "File": File, "Media": Media, "HeadTitle": "Media", "Count": len(Media), "Mediamenu": true, "Tabmenu": TabName, "StorageType": selectedtype.SelectedType, "Nextcont": nextcont, "Previous": Previous, "Next": Next, "Page": Page, "Limit": limt, "PageCount": PageCount, "CurrentPage": pageno, "Paginationendcount": paginationendcount, "Paginationstartcount": paginationstartcount, "Filter": search, "ListCount": len(Folder) + len(File)})
}
/*ADD FOLDER OR File*/
func AddFolder(c *gin.Context) {
foldername := c.PostForm("foldername")
folderpath := c.PostForm("path")
selectedtype, _ := GetSelectedType()
if selectedtype.SelectedType == "local" {
_ = storagecontroller.AddFolderMakeDir(foldername, folderpath)
} else if selectedtype.SelectedType == "aws" {
_, makedirerr := storagecontroller.CreateFolderToS3(foldername, folderpath)
if makedirerr != nil {
ErrorLog.Printf("add folder error: %s", makedirerr)
json.NewEncoder(c.Writer).Encode("false")
return
}
}
json.NewEncoder(c.Writer).Encode("true")
}
/*REMOVE FOLDER*/
func DeleteFolderFile(c *gin.Context) {
deleteid := strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(c.PostForm("id"), "[", ""), "]", ""), `"`, "")
ids := strings.Split(deleteid, ",")
folderpath := c.PostForm("path")
selectedtype, _ := GetSelectedType()
var DeleteErr error
if len(deleteid) > 0 {
for _, val := range ids {
if selectedtype.SelectedType == "local" {
fmt.Println("Local selected")
DeleteErr = storagecontroller.DeleteImageFolder(folderpath, val)
} else if selectedtype.SelectedType == "aws" {
fmt.Println("S3 selected")
err := storagecontroller.DeleteS3FolderAndContents(val)
if err != nil {
fmt.Printf("Error deleting folder and contents %s: %v\n", val, err)
}
}
// } else if selectedtype.SelectedType == "aws" {
// fmt.Println("s3 selected")
// resp1, _ := storagecontroller.ListS3BucketWithPath(val)
// for _, val := range resp1.CommonPrefixes {
// storagecontroller.DeleteS3Files(*val.Prefix)
// }
// DeleteErr = storagecontroller.DeleteS3Files(val)
// }
if DeleteErr != nil {
json.NewEncoder(c.Writer).Encode(false)
return
}
}
}
json.NewEncoder(c.Writer).Encode(true)
}
/*Individual Folder Details*/
func FolderDetails(c *gin.Context) {
folderpath := c.PostForm("path")
var (
Media []storagecontroller.Medias
Folder []storagecontroller.Medias
File []storagecontroller.Medias
err error
folderCount, fileCount int
nextconf string
)
selectedtype, _ := GetSelectedType()
if selectedtype.SelectedType == "local" {
folderCount, fileCount, Folder, File, err = storagecontroller.FolderDetails(folderpath + "/")
if err != nil {
fmt.Println(err)
}
} else if selectedtype.SelectedType == "aws" {
resp1, _ := storagecontroller.ListS3BucketWithPath(folderpath + "/")
Folder, File = MakeFolderandFileArr(resp1, folderpath, "")
if resp1.NextContinuationToken != nil {
nextconf = *resp1.NextContinuationToken
}
}
sort.SliceStable(Folder, func(i, j int) bool {
return Folder[i].ModTime.Unix() > Folder[j].ModTime.Unix()
})
sort.SliceStable(File, func(i, j int) bool {
return File[i].ModTime.Unix() > File[j].ModTime.Unix()
})
Media = append(Media, Folder...)
Media = append(Media, File...)
json.NewEncoder(c.Writer).Encode(gin.H{"folder": Folder, "file": File, "mediaCount": len(Media), "fileCount": fileCount, "folderCount": folderCount, "Media": Media, "nextcont": nextconf})
}
/*Upload Image*/
func UploadImageMedia(c *gin.Context) {
imageData := c.Request.PostFormValue("file")
imagename := c.Request.PostFormValue("name")
var Path string
selectedtype, _ := GetSelectedType()
if selectedtype.SelectedType == "local" {
Path = storagecontroller.UploadCropImage(imageData, imagename)
} else if selectedtype.SelectedType == "aws" {
storagecontroller.StoreS3Base64(strings.ReplaceAll(imageData, "data:image/jpeg;base64,", ""), "media/", imagename)
}
json.NewEncoder(c.Writer).Encode(gin.H{"Path": "/" + Path + imagename})
}
/*Upload system image */
func UploadImage(c *gin.Context) {
var err error
file, fileheader, err := c.Request.FormFile("image")
if err != nil {
c.String(http.StatusBadRequest, fmt.Sprintf("get form err: %s", err))
return
}
if fileheader.Size > int64(maxSize) {
c.JSON(http.StatusRequestEntityTooLarge, gin.H{"error": "File size exceeds 8MB"})
return
}
var UploadErr error
selectedtype, _ := GetSelectedType()
if selectedtype.SelectedType == "local" {
UploadErr = storagecontroller.UploadImageLocal(file, fileheader, c.Request.PostFormValue("path"), c)
} else if selectedtype.SelectedType == "aws" {
UploadErr = storagecontroller.UploadFileS3(file, fileheader, c.Request.PostFormValue("path"))
} else if selectedtype.SelectedType == "azure" {
} else if selectedtype.SelectedType == "drive" {
fmt.Println("drive selected")
}
if UploadErr != nil {
json.NewEncoder(c.Writer).Encode(false)
return
}
json.NewEncoder(c.Writer).Encode(true)
}
// view image
func ResizeImage(c *gin.Context) {
fileName := c.Query("name")
filePath := c.Query("path")
width, _ := strconv.ParseUint(c.Query("width"), 10, 64)
height, _ := strconv.ParseUint(c.Query("height"), 10, 64)
extention := path.Ext(fileName)
rawObject, err := storagecontroller.GetObjectFromS3(filePath + fileName)
if err != nil {
fmt.Println(err)
return
}
var buf bytes.Buffer
buf.ReadFrom(rawObject.Body)
if extention == ".svg" {
svgData := buf.String()
c.Data(http.StatusOK, "image/svg+xml", []byte(svgData))
return
}
Image, _, erri := image.Decode(bytes.NewReader(buf.Bytes()))
if erri != nil {
fmt.Println(erri)
return
}
newImage := resize.Resize(uint(width), uint(height), Image, resize.Lanczos3)
if extention == ".png" {
png.Encode(c.Writer, newImage)
return
}
if extention == ".gif" {
gif.Encode(c.Writer, newImage, nil)
return
}
if extention == ".jpeg" || extention == ".jpg" {
_ = jpeg.Encode(c.Writer, newImage, nil)
}
}
func AudioResize(c *gin.Context) {
fileName := c.Query("name")
filePath := c.Query("path")
extension := path.Ext(fileName)
rawObject, err := storagecontroller.GetObjectFromS3(filePath + fileName)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to retrieve the audio file"})
return
}
defer rawObject.Body.Close()
buf := new(bytes.Buffer)
if _, err := buf.ReadFrom(rawObject.Body); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to read audio data"})
return
}
audioData := buf.Bytes()
switch extension {
case ".mpeg":
c.Data(http.StatusOK, "audio/mpeg", audioData)
case ".mp3":
c.Data(http.StatusOK, "audio/mpeg", audioData)
case ".wav":
c.Data(http.StatusOK, "audio/wav", audioData)
default:
c.JSON(http.StatusUnsupportedMediaType, gin.H{"error": "Unsupported audio format"})
}
}
func DocumentResize(c *gin.Context) {
fileName := c.Query("name")
filePath := c.Query("path")
extension := path.Ext(fileName)
rawObject, err := storagecontroller.GetObjectFromS3(filePath + fileName)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to retrieve the document file"})
return
}
defer rawObject.Body.Close()
buf := new(bytes.Buffer)
if _, err := buf.ReadFrom(rawObject.Body); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to read document data"})
return
}
documentData := buf.Bytes()
switch extension {
case ".pdf":
c.Data(http.StatusOK, "application/pdf", documentData)
case ".doc", ".docx":
c.Data(http.StatusOK, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", documentData)
case ".txt":
c.Data(http.StatusOK, "text/plain", documentData)
case ".zip":
c.Data(http.StatusOK, "application/zip", documentData)
default:
c.JSON(http.StatusUnsupportedMediaType, gin.H{"error": "Unsupported document format"})
}
}
// make folder and file array
func MakeFolderandFileArr(resp1 *s3.ListObjectsV2Output, parentfoldername string, searchfilter string) (folders []storagecontroller.Medias, files []storagecontroller.Medias) {
var (
Folder []storagecontroller.Medias
File []storagecontroller.Medias
)
if searchfilter != "" {
for _, val := range resp1.CommonPrefixes {
if strings.Contains(strings.ToLower(RemoveSpecialCharacter(strings.Replace(*val.Prefix, parentfoldername, "", 1))), strings.ToLower(searchfilter)) {
// obj, _ := storagecontroller.GetObjectFromS3(*val.Prefix)
var Folde storagecontroller.Medias
filename := RemoveSpecialCharacter(strings.Replace(*val.Prefix, parentfoldername, "", 1))
Folde.File = true
Folde.Path = filename
Folde.AliaseName = *val.Prefix
Folde.Name = filename
// Folde.ModTime = *obj.LastModified
Folder = append(Folder, Folde)
}
}
for _, val := range resp1.Contents {
if strings.Contains(strings.ToLower(*val.Key), strings.ToLower(searchfilter)) {
if strings.Contains(*val.Key, ".jpeg") || strings.Contains(*val.Key, ".png") || strings.Contains(*val.Key, ".jpg") || strings.Contains(*val.Key, ".svg") {
var file storagecontroller.Medias
filename := strings.Replace(*val.Key, parentfoldername, "", 1)
Lastupdate := *val.LastModified
file.File = false
file.Name = filename
file.AliaseName = *val.Key
file.Path = parentfoldername
file.ModTime = Lastupdate
File = append(File, file)
}
}
}
} else {
for _, val := range resp1.CommonPrefixes {
folderPrefix := *val.Prefix
var folderCount, imageCount int
// List objects in the current folder
resp2, err := storagecontroller.ListS3BucketWithPath(folderPrefix)
if err != nil {
// Handle error
continue
}
for _, obj := range resp2.Contents {
if strings.HasSuffix(*obj.Key, "/") {
// Increment folder count
folderCount++
} else {
// Increment image count
imageCount++
}
}
folderCount = len(resp2.CommonPrefixes)
// obj, _ := storagecontroller.GetObjectFromS3(*val.Prefix)
var Folde storagecontroller.Medias
filename := RemoveSpecialCharacter(strings.Replace(*val.Prefix, parentfoldername, "", 1))
Folde.File = true
Folde.Path = filename
Folde.AliaseName = *val.Prefix
Folde.Name = filename
Folde.TotalSubMedia = folderCount + imageCount
// Folde.ModTime = *obj.LastModified
Folder = append(Folder, Folde)
}
for _, val := range resp1.Contents {
if strings.Contains(*val.Key, ".jpeg") || strings.Contains(*val.Key, ".png") || strings.Contains(*val.Key, ".jpg") || strings.Contains(*val.Key, ".svg") {
var file storagecontroller.Medias
filename := strings.Replace(*val.Key, parentfoldername, "", 1)
Lastupdate := *val.LastModified
file.File = false
file.Name = filename
file.AliaseName = *val.Key
file.Path = parentfoldername
file.ModTime = Lastupdate
File = append(File, file)
}
}
}
return Folder, File
}
func GetMedia() (Folders []storagecontroller.Medias, Files []storagecontroller.Medias, TotalMedia []storagecontroller.Medias, Nextcontin string, err error) {
var (
MediaErr error
Media []storagecontroller.Medias
Folder []storagecontroller.Medias
File []storagecontroller.Medias
nextcont string
search string
)
selectedtype, _ := GetSelectedType()
if selectedtype.SelectedType == "local" {
Folder, File, MediaErr = storagecontroller.MediaLocalList(search, "")
if MediaErr != nil {
ErrorLog.Println(MediaErr)
}
} else if selectedtype.SelectedType == "aws" {
// resp, _ := storagecontroller.ListS3Bucket()
resp1, err := storagecontroller.ListS3BucketWithPath("media/")
nextcont = *resp1.NextContinuationToken
if err != nil {
fmt.Println("please check the aws fields")
return []storagecontroller.Medias{}, []storagecontroller.Medias{}, []storagecontroller.Medias{}, nextcont, err
}
Folder, File = MakeFolderandFileArr(resp1, "media/", "")
}
sort.SliceStable(Folder, func(i, j int) bool {
return Folder[i].ModTime.Unix() > Folder[j].ModTime.Unix()
})
sort.SliceStable(File, func(i, j int) bool {
return File[i].ModTime.Unix() > File[j].ModTime.Unix()
})
Media = append(Media, Folder...)
Media = append(Media, File...)
return Folder, File, Media, nextcont, nil
}
func LoadMore(c *gin.Context) {
offset, _ := strconv.Atoi(c.PostForm("offset"))
search := c.PostForm("search")
folderpath := c.PostForm("path")
var limit = 40
// offset := limit * offse
fmt.Println(offset, "offsetvalue")
_, _, Medias, NextCont, _ := GetMedia1(search, folderpath)
Folder, File, Media := S3ArrPagination(Medias, limit, offset)
json.NewEncoder(c.Writer).Encode(gin.H{"folder": Folder, "file": File, "nextcont": NextCont, "Media": Media, "count": len(Medias), "LoadFileCount": len(Folder) + len(File)})
}
func LoadMoreS3(NextCont string) (Folders []storagecontroller.Medias, Files []storagecontroller.Medias, TotalMedia []storagecontroller.Medias, NextContu string, err error) {
var (
MediaErr error
Media []storagecontroller.Medias
Folder []storagecontroller.Medias
File []storagecontroller.Medias
nextcont string
search string
)
selectedtype, _ := GetSelectedType()
if selectedtype.SelectedType == "local" {
Folder, File, MediaErr = storagecontroller.MediaLocalList(search, "")
if MediaErr != nil {
ErrorLog.Println(MediaErr)
}
} else if selectedtype.SelectedType == "aws" {
resp1, err := storagecontroller.LoadMoreListS3BucketWithPath("media/", NextCont)
if err != nil {
fmt.Println("please check the aws fields")
return []storagecontroller.Medias{}, []storagecontroller.Medias{}, []storagecontroller.Medias{}, nextcont, err
}
if resp1.NextContinuationToken != nil {
nextcont = *resp1.NextContinuationToken
}
Folder, File = MakeFolderandFileArr(resp1, "media/", "")
}
sort.SliceStable(Folder, func(i, j int) bool {
return Folder[i].ModTime.Unix() > Folder[j].ModTime.Unix()
})
sort.SliceStable(File, func(i, j int) bool {
return File[i].ModTime.Unix() > File[j].ModTime.Unix()
})
Media = append(Media, Folder...)
Media = append(Media, File...)
return Folder, File, Media, nextcont, nil
}
func GetMedia1(search, folderpath string) (Folders []storagecontroller.Medias, Files []storagecontroller.Medias, TotalMedia []storagecontroller.Medias, Nextcontin string, err error) {
var (
MediaErr error
Media []storagecontroller.Medias
Folder []storagecontroller.Medias
File []storagecontroller.Medias
nextcont string
)
selectedtype, _ := GetSelectedType()
if selectedtype.SelectedType == "local" {
Folder, File, MediaErr = storagecontroller.MediaLocalList(search, folderpath)
if MediaErr != nil {
ErrorLog.Println(MediaErr)
}
} else if selectedtype.SelectedType == "aws" {
resp1, err := storagecontroller.ListS3BucketWithPath1("media/" + folderpath)
if err != nil {
ErrorLog.Println(err)
return []storagecontroller.Medias{}, []storagecontroller.Medias{}, []storagecontroller.Medias{}, nextcont, err
}
Folder, File = MakeFolderandFileArr(resp1, "media/"+folderpath, search)
}
sort.SliceStable(Folder, func(i, j int) bool {
return Folder[i].ModTime.Unix() > Folder[j].ModTime.Unix()
})
sort.SliceStable(File, func(i, j int) bool {
return File[i].ModTime.Unix() > File[j].ModTime.Unix()
})
Media = append(Media, Folder...)
Media = append(Media, File...)
return Folder, File, Media, nextcont, nil
}
func S3ArrPagination(Media []storagecontroller.Medias, limit int, offset int) (s []storagecontroller.Medias, f []storagecontroller.Medias, m []storagecontroller.Medias) {
var (
Files []storagecontroller.Medias
Folders []storagecontroller.Medias
Medias []storagecontroller.Medias
)
end := limit + offset
if end > len(Media) {
end = len(Media)
}
for i := offset; i < end; i++ {
if Media[i].File {
var Folde storagecontroller.Medias
Folde.File = true
Folde.Path = Media[i].Path
Folde.AliaseName = Media[i].AliaseName
Folde.TotalSubMedia = Media[i].TotalSubMedia
Folde.Name = Media[i].Name
Folders = append(Folders, Folde)
} else {
var files storagecontroller.Medias
files.File = false
files.Name = Media[i].Name
files.AliaseName = Media[i].AliaseName
files.Path = Media[i].Path
files.ModTime = Media[i].ModTime
Files = append(Files, files)
}
Medias = append(Medias, Media[i])
}
return Folders, Files, Medias
}
func RenameMediaPath(c *gin.Context) {
oldFilename := c.PostForm("oldfilename")
newFilename := c.PostForm("newfilename")
filetype := c.PostForm("filetype")
newFilename1 := filepath.Dir(oldFilename)
if !strings.HasSuffix(newFilename1, "/") {
newFilename1 += "/"
}
var oldObjectKey string
var newObjectKey string
if filetype == "filediv" {
oldObjectKey = oldFilename
newObjectKey = newFilename1 + newFilename
} else if filetype == "folderdiv" {
oldObjectKey = oldFilename + "/"
newObjectKey = newFilename1 + newFilename + "/"
}
selectedtype, _ := GetSelectedType()
fmt.Println(oldObjectKey, newObjectKey, "checkrenameee")
if selectedtype.SelectedType == "local" {
fmt.Println("Local selected")
} else if selectedtype.SelectedType == "aws" {
fmt.Println("s3 selected")
err1 := storagecontroller.RenameFileS3(oldObjectKey, newObjectKey)
fmt.Println(err1, "getting error from renameprocess")
} else if selectedtype.SelectedType == "azure" {
} else if selectedtype.SelectedType == "drive" {
fmt.Println("drive selected")
}
json.NewEncoder(c.Writer).Encode(true)
}
+82
View File
@@ -0,0 +1,82 @@
package controllers
import (
"fmt"
"spurt-cms/models"
"github.com/gin-gonic/gin"
csrf "github.com/utrack/gin-csrf"
"gorm.io/datatypes"
)
func MediaSettings(c *gin.Context) {
menu := NewMenuController(c)
ModuleName, TabName, _ := ModuleRouteName(c)
Storagetype, err := models.GetStorageValue(TenantId)
if err != nil {
fmt.Println(err)
}
var aws models.AWS
if Storagetype.Aws != nil {
aws.AccessId = Storagetype.Aws["AccessId"].(string)
aws.AccessKey = Storagetype.Aws["AccessKey"].(string)
aws.Region = Storagetype.Aws["Region"].(string)
aws.BucketName = Storagetype.Aws["BucketName"].(string)
}
var azure models.Azure
if Storagetype.Azure != nil {
azure.StorageAccount = Storagetype.Azure["AzureAccount"].(string)
azure.AccountKey = Storagetype.Azure["AzureKey"].(string)
azure.ContainerName = Storagetype.Azure["AzureContainer"].(string)
}
translate, _ := TranslateHandler(c)
c.HTML(200, "media_settings.html", gin.H{"Menu": menu, "Mediamenu": true, "title": ModuleName, "Tabmenu": TabName, "HeadTitle": "Media", "csrf": csrf.GetToken(c), "aws": aws, "azure": azure, "local": Storagetype.Local, "Storage": Storagetype, "translate": translate})
}
func MediaStorageUpdate(c *gin.Context) {
selectedtype := c.Request.PostFormValue("type")
local := c.PostForm("local")
awsid := c.PostForm("awsid")
awskey := c.PostForm("awskey")
awsregion := c.PostForm("awsregion")
awsbucketname := c.PostForm("awsbucketname")
azureacc := c.PostForm("azureacc")
azurekey := c.PostForm("azurekey")
azurecontainer := c.PostForm("azurecontainer")
var Stype models.TblStorageType
Stype.Local = local
Stype.Aws = datatypes.JSONMap{"AccessId": awsid, "AccessKey": awskey, "Region": awsregion, "BucketName": awsbucketname}
Stype.Azure = datatypes.JSONMap{"AzureAccount": azureacc, "AzureKey": azurekey, "AzureContainer": azurecontainer}
Stype.SelectedType = selectedtype
_, err := models.UpdateStorageType(Stype, TenantId)
if err != nil {
fmt.Println(err)
c.SetCookie("get-toast", ErrInternalServerError, 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/media/settings/")
return
}
c.SetCookie("get-toast", "Media Settings Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/media/settings/")
}
File diff suppressed because it is too large Load Diff
+522
View File
@@ -0,0 +1,522 @@
package controllers
import (
"encoding/json"
"fmt"
"strconv"
"strings"
"github.com/gin-gonic/gin"
"github.com/spurtcms/auth"
mem "github.com/spurtcms/member"
csrf "github.com/utrack/gin-csrf"
)
type memfilter struct {
Keyword string
Category string
Status string
FromDate string
ToDate string
FirstName string
}
/* List Member Group*/
func MemberGroupList(c *gin.Context) {
var (
limt int
offset int
filter memfilter
)
//get values from html from data
limit := c.Query("limit")
pageno, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
filter.Keyword = strings.Trim(c.DefaultQuery("keyword", ""), " ")
var filterflag bool
if filter.Keyword != "" {
filterflag = true
} else {
filterflag = false
}
if limit == "" {
limt = Limit
} else {
limt, _ = strconv.Atoi(limit)
}
if pageno != 0 {
offset = (pageno - 1) * limt
}
permisison, perr := NewAuth.IsGranted("Members Group", auth.Read, TenantId)
if perr != nil {
ErrorLog.Printf("Member group list authorization error: %s", perr)
}
if perr != nil {
ErrorLog.Printf("MemberGroup authorization error: %s", perr)
c.Redirect(301, "/403-page")
return
}
if permisison {
// get member group list
var membergrouplist []mem.Tblmembergroup
MemberConfig.DataAccess = c.GetInt("dataaccess")
MemberConfig.UserId = c.GetInt("userid")
membergrouplists, _, err := MemberConfig.ListMemberGroup(mem.MemberGroupListReq{Limit: limt, Offset: offset, Keyword: filter.Keyword}, TenantId)
if err != nil {
ErrorLog.Printf("membergroup list details error: %s", err)
}
for _, membergroupvalue := range membergrouplists {
if !membergroupvalue.ModifiedOn.IsZero() {
membergroupvalue.DateString = membergroupvalue.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
membergroupvalue.DateString = membergroupvalue.CreatedOn.In(TZONE).Format(Datelayout)
}
membergrouplist = append(membergrouplist, membergroupvalue)
}
_, Total_members, err := MemberConfig.ListMemberGroup(mem.MemberGroupListReq{Keyword: filter.Keyword}, TenantId)
if err != nil {
ErrorLog.Printf("membergroup list details error: %s", err)
}
var paginationendcount = len(membergrouplists) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(pageno, int(Total_members), limt)
menu := NewMenuController(c)
ModuleName, TabName, _ := ModuleRouteName(c)
translate, _ := TranslateHandler(c)
uper, _ := NewAuth.IsGranted("Members Group", auth.Update, TenantId)
dper, _ := NewAuth.IsGranted("Members Group", auth.Delete, TenantId)
c.HTML(200, "groups.html", gin.H{"csrf": csrf.GetToken(c), "Pagination": PaginationData{
NextPage: pageno + 1,
PreviousPage: pageno - 1,
TotalPages: PageCount,
TwoAfter: pageno + 2,
TwoBelow: pageno - 2,
ThreeAfter: pageno + 3,
}, "title": ModuleName, "translate": translate, "Searchtrue": filterflag, "linktitle": "Users Group", "Menu": menu, "Limit": limt, "MemberGroupList": membergrouplist, "Count": Total_members, "Previous": Previous, "Page": Page, "Next": Next, "PageCount": PageCount, "CurrentPage": pageno, "Paginationendcount": paginationendcount, "Paginationstartcount": paginationstartcount, "HeadTitle": translate.Memberss.Members, "Filter": filter, "Membermenu": true, "Groupmenu": true, "Tabmenu": TabName, "permission": uper, "dpermission": dper})
}
}
/* Create Member Group*/
func CreateNewMemberGroup(c *gin.Context) {
//get values from html from data
userid := c.GetInt("userid")
MemberGroup := mem.MemberGroupCreation{
Name: c.PostForm("membergroup_name"),
Description: c.PostForm("membergroup_desc"),
CreatedBy: userid,
}
permisison, perr := NewAuth.IsGranted("Members Group", auth.Create, TenantId)
if perr != nil {
ErrorLog.Printf("Member Group List authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("Membergroup authorization error: %s", perr)
c.Redirect(301, "/403-page")
return
}
if permisison {
err := MemberConfig.CreateMemberGroup(MemberGroup, TenantId) //Create member group
if err != nil {
if err != nil {
ErrorLog.Printf("create membergroup error: %s", err)
}
}
if strings.Contains(fmt.Sprint(err), "given some values is empty") {
c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
c.Redirect(301, "/admin/usergroup/")
return
}
if err != nil {
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.SetCookie("Alert-msg", "alert", 3600, "", "", false, false)
c.Redirect(301, "/admin/usergroup/")
return
}
c.SetCookie("get-toast", "Member Group Created Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/admin/usergroup/")
} else {
c.Redirect(301, "/403-page")
}
}
/* Update Member Group*/
func UpdateMemberGroup(c *gin.Context) {
var url string
//get values from html from data
id, _ := strconv.Atoi(c.PostForm("membergroup_id"))
pageno := c.PostForm("memgrbpageno")
if pageno != "" {
url = "/admin/usergroup?page=" + pageno
} else {
url = "/admin/usergroup/"
}
userid := c.GetInt("userid")
MemberGroup := mem.MemberGroupCreationUpdation{
Name: c.PostForm("membergroup_name"),
Description: c.PostForm("membergroup_desc"),
ModifiedBy: userid,
}
permisison, perr := NewAuth.IsGranted("Members Group", auth.Update, TenantId)
if perr != nil {
ErrorLog.Printf("Member Group List authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("Membergroup authorization error: %s", perr)
c.Redirect(301, "/403-page")
return
}
if permisison {
err := MemberConfig.UpdateMemberGroup(MemberGroup, id, TenantId) //update member group
if err != nil {
ErrorLog.Printf("membergroup update error: %s", err)
}
if strings.Contains(fmt.Sprint(err), "given some values is empty") {
c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
c.Redirect(301, url)
return
}
if err != nil {
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.SetCookie("Alert-msg", "alert", 3600, "", "", false, false)
c.Redirect(301, url)
return
}
c.SetCookie("get-toast", "Member Group Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, url)
}
}
/* Delete Member Group*/
func DeleteMemberGroup(c *gin.Context) {
var url string
//get values from html from data
MemberGroupId, _ := strconv.Atoi(c.Query("id"))
pageno := c.Query("page")
if pageno != "" {
url = "/admin/usergroup?page=" + pageno
} else {
url = "/admin/usergroup/"
}
userid := c.GetInt("userid")
permisison, perr := NewAuth.IsGranted("Members Group", auth.Delete, TenantId)
if perr != nil {
ErrorLog.Printf("Member Group List authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("Membergroup authorization error: %s", perr)
c.Redirect(301, "/403-page")
return
}
if permisison {
err := MemberConfig.DeleteMemberGroup(MemberGroupId, userid, TenantId) //delete member group
if err != nil {
ErrorLog.Printf("membergroup delete error: %s", err)
}
_, Total_membergrp, err := MemberConfig.ListMemberGroup(mem.MemberGroupListReq{Keyword: ""}, TenantId)
if err != nil {
ErrorLog.Printf("membergroup list details error: %s", err)
}
recordsPerPage := Limit
totalPages := (int(Total_membergrp) + recordsPerPage - 1) / recordsPerPage
currentPage := 1
if pageno != "" {
currentPage, _ = strconv.Atoi(pageno)
}
if currentPage > totalPages && totalPages > 0 {
url = "/admin/usergroup?page=" + strconv.Itoa(totalPages)
}
fmt.Println("url", url)
if err != nil {
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.SetCookie("Alert-msg", "alert", 3600, "", "", false, false)
c.Redirect(301, url)
return
}
c.SetCookie("get-toast", "Member Group Deleted Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, url)
}
}
/*Update Member Group status*/
func MemberIsActive(c *gin.Context) {
//get values from html from data
id, _ := strconv.Atoi(c.Request.PostFormValue("id"))
val, _ := strconv.Atoi(c.Request.PostFormValue("isactive"))
userid := c.GetInt("userid")
permisison, perr := NewAuth.IsGranted("Members Group", auth.Update, TenantId)
if perr != nil {
ErrorLog.Printf("Member Group List authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("Membergroup authorization error: %s", perr)
c.Redirect(301, "/403-page")
return
}
if permisison {
flg, err := MemberConfig.MemberGroupIsActive(id, val, userid, TenantId) //update member group status
if err != nil {
ErrorLog.Printf("membergroup status update error: %s", err)
json.NewEncoder(c.Writer).Encode(flg)
} else {
json.NewEncoder(c.Writer).Encode(flg)
}
}
}
func CheckNameInMemberGroup(c *gin.Context) {
id, _ := strconv.Atoi(c.PostForm("membergroup_id"))
name := c.PostForm("membergroup_name")
permisison, perr := NewAuth.IsGranted("Members Group", auth.Read, TenantId)
if perr != nil {
ErrorLog.Printf("multi group delete authorization error :%s", perr)
}
if !permisison {
ErrorLog.Printf("Membergroup authorization error: %s", perr)
c.Redirect(301, "/403-page")
return
}
if permisison {
flg, err := MemberConfig.CheckNameInMemberGroup(id, name, TenantId)
if err != nil {
ErrorLog.Printf("check name in member error :%s", perr)
json.NewEncoder(c.Writer).Encode(false)
return
}
json.NewEncoder(c.Writer).Encode(flg)
}
}
func MultiSelectDeleteMembergroup(c *gin.Context) {
var (
memberdata []map[string]string
Memberids []int
url string
)
if err := json.Unmarshal([]byte(c.Request.PostFormValue("memberids")), &memberdata); err != nil {
fmt.Println(err)
}
for _, val := range memberdata {
memberid, _ := strconv.Atoi(val["memberid"])
Memberids = append(Memberids, memberid)
}
pageno := c.PostForm("page")
if pageno != "" {
url = "/admin/usergroup?page=" + pageno
} else {
url = "/admin/usergroup/"
}
userid := c.GetInt("userid")
permisison, perr := NewAuth.IsGranted("Members Group", auth.Delete, TenantId)
if perr != nil {
ErrorLog.Printf("multi group delete authorization error :%s", perr)
}
if !permisison {
ErrorLog.Printf("Membergroup authorization error: %s", perr)
c.JSON(200, gin.H{"value": false, "url": "/403-page"})
return
}
if permisison {
_, err := MemberConfig.MultiSelectedMemberDeletegroup(Memberids, userid, TenantId)
if err != nil {
ErrorLog.Printf("multi group delete error :%s", perr)
c.JSON(200, gin.H{"value": false})
return
}
_, Total_membergrp, err := MemberConfig.ListMemberGroup(mem.MemberGroupListReq{Keyword: ""}, TenantId)
if err != nil {
ErrorLog.Printf("membergroup list details error: %s", err)
}
recordsPerPage := Limit
totalPages := (int(Total_membergrp) + recordsPerPage - 1) / recordsPerPage
currentPage := 1
if pageno != "" {
currentPage, _ = strconv.Atoi(pageno)
}
if currentPage > totalPages && totalPages > 0 {
url = "/admin/usergroup?page=" + strconv.Itoa(totalPages)
}
c.JSON(200, gin.H{"value": true, "url": url})
}
}
func MultiSelectMembersgroupStatus(c *gin.Context) {
var (
memberdata []map[string]string
memberids []int
statusint int
status int
)
if err := json.Unmarshal([]byte(c.Request.PostFormValue("memberids")), &memberdata); err != nil {
fmt.Println(err)
}
for _, val := range memberdata {
memberid, _ := strconv.Atoi(val["memberid"])
statusint, _ = strconv.Atoi(val["status"])
if statusint == 0 {
status = 1
} else if statusint == 1 {
status = 0
}
memberids = append(memberids, memberid)
}
pageno := c.PostForm("page")
var url string
if pageno != "" {
url = "/admin/usergroup?page=" + pageno
} else {
url = "/admin/usergroup/"
}
userid := c.GetInt("userid")
permisison, perr := NewAuth.IsGranted("Members Group", auth.Update, TenantId)
if perr != nil {
ErrorLog.Printf("multi group status authorization error :%s", perr)
}
if !permisison {
ErrorLog.Printf("Membergroup authorization error: %s", perr)
c.Redirect(301, "/403-page")
return
}
if permisison {
_, err := MemberConfig.MultiSelectMembersgroupStatus(memberids, status, userid, TenantId)
if err != nil {
ErrorLog.Printf("multi group delete authorization error :%s", err)
c.JSON(200, gin.H{"value": false})
return
}
c.JSON(200, gin.H{"value": true, "status": status, "url": url})
}
}
func Chkmemgrphavemember(c *gin.Context) {
var (
membergrpdata []map[string]string
Membergrpids []int
)
memgrp_id, _ := strconv.Atoi(c.PostForm("id"))
if err := json.Unmarshal([]byte(c.Request.PostFormValue("membergrpids")), &membergrpdata); err != nil {
fmt.Println(err)
}
for _, val := range membergrpdata {
memberid, _ := strconv.Atoi(val["memberid"])
Membergrpids = append(Membergrpids, memberid)
}
_, err := MemberConfig.Membergroupcheckmember(memgrp_id, Membergrpids, TenantId)
if err != nil {
ErrorLog.Printf("Member group check hane Error :%s", err)
c.JSON(200, gin.H{"value": false})
return
}
c.JSON(200, gin.H{"value": true})
}
+132
View File
@@ -0,0 +1,132 @@
package controllers
import (
"encoding/json"
"log"
"spurt-cms/models"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
csrf "github.com/utrack/gin-csrf"
)
func MemberSettings(c *gin.Context) {
menu := NewMenuController(c)
moulename, TabName, moduleid := ModuleRouteName(c)
templatelist, _ := models.GetTemplatesByModuleId(moduleid, TenantId)
membersetttings, _ := models.GetMemberSettings(TenantId)
Adminroles, _ := NewRoleWP.GetRoleByName(TenantId)
var Adminroleids []int
for _, val := range Adminroles {
Adminroleids = append(Adminroleids, val.Id)
}
Adminmember, _ := NewTeamWP.GetAdminRoleUsers(Adminroleids, TenantId)
translate, _ := TranslateHandler(c)
c.HTML(200, "membersettings.html", gin.H{"Menu": menu, "linktitle": "Member Settings", "Cmsmenu": true, "title": moulename, "Tabmenu": TabName, "HeadTitle": translate.Memberss.Members, "Templatelist": templatelist, "csrf": csrf.GetToken(c), "Membersettings": membersetttings, "Adminmembers": Adminmember, "translate": translate})
}
func MemberSettingUpdate(c *gin.Context) {
var updatedetails models.TblMemberSetting
updatedetails.AllowRegistration, _ = strconv.Atoi(c.PostForm("allowregistration"))
updatedetails.MemberLogin = strings.ToLower(c.PostForm("memberlogin"))
updatedetails.ModifiedOn, _ = time.Parse("2006-01-02 15:04:05", time.Now().UTC().Format("2006-01-02 15:04:05"))
updatedetails.ModifiedBy = c.GetInt("userid")
updatedetails.Id, _ = strconv.Atoi(c.PostForm("membersettingid"))
updatedetails.NotificationUsers = c.PostForm("multiselectuser")
var templatedata []map[string]string
if err := json.Unmarshal([]byte(c.Request.PostFormValue("templatestatus")), &templatedata); err != nil {
log.Println(err)
}
userid := c.GetInt("userid")
var template models.TblEmailTemplate
for _, val := range templatedata {
template.Id, _ = strconv.Atoi(val["templateid"])
template.IsActive, _ = strconv.Atoi(val["status"])
err1 := models.TemplateStatus(template.Id, template.IsActive, userid, TenantId)
if err1 != nil {
log.Println(err1)
}
}
err := models.UpdateMemberSetting(&updatedetails, TenantId)
if err != nil {
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
return
}
c.SetCookie("get-toast", "Member Settings Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/user/settings/")
}
func EditMemberSettingTemplate(c *gin.Context) {
var temp models.TblEmailTemplate
var id, _ = strconv.Atoi(c.Query("id"))
models.GetTempdetail(&temp, id, TenantId)
c.JSON(200, temp)
}
func UpdateMemberSettingTemplate(c *gin.Context) {
if c.PostForm("tempname") == "" || c.PostForm("tempdesc") == "" || c.PostForm("tempsub") == "" || c.PostForm("temcont") == "" {
c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
c.Redirect(301, "/user/settings/")
return
}
var template models.TblEmailTemplate
template.TemplateName = c.PostForm("tempname")
template.TemplateSubject = (c.PostForm("tempsub"))
template.TemplateMessage = c.PostForm("temcont")
template.TemplateDescription = c.PostForm("tempdesc")
template.ModifiedBy = c.GetInt("userid")
template.Id, _ = strconv.Atoi(c.PostForm("userid"))
template.ModifiedOn, _ = time.Parse("2006-01-02 15:04:05", time.Now().In(TZONE).Format("2006-01-02 15:04:05"))
err := models.UpdateTemplate(&template, TenantId)
if err != nil {
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.Redirect(301, "/user/settings/")
return
}
c.SetCookie("get-toast", "Templateupdatedsuccessfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/user/settings/")
}
+546
View File
@@ -0,0 +1,546 @@
package controllers
import (
"encoding/json"
"log"
"strconv"
"strings"
"github.com/gin-gonic/gin"
"github.com/spurtcms/auth"
memship "github.com/spurtcms/membership"
csrf "github.com/utrack/gin-csrf"
)
// membership level
func Membership(c *gin.Context) {
var (
limt int
offset int
filter memship.Filter
)
//get data from html url query
limit := c.Query("limit")
pageno, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
filter.Keyword = strings.Trim(c.DefaultQuery("keyword", ""), " ")
filter.Level = strings.Trim(c.DefaultQuery("filter-level", ""), " ")
filter.FromDate = strings.Trim(c.DefaultQuery("startdate", ""), " ")
filter.ToDate = strings.Trim(c.DefaultQuery("enddate", ""), " ")
var filterflag bool
if filter.Keyword != "" {
filterflag = true
} else {
filterflag = false
}
if limit == "" {
limt = Limit
} else {
limt, _ = strconv.Atoi(limit)
}
if pageno != 0 {
offset = (pageno - 1) * limt
}
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipLevel authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipLevel authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
MembershiplevelList, TotalMembershipLevelCount, err := MembershipConfig.MembershipLevelsList(offset, limt, memship.Filter(filter), TenantId)
// for _,Membershiplevel := range MembershiplevelList{
// Intervel:=Membershiplevel.BillingCyclelimit *Membershiplevel.BillingfrequentType
// switch {
// case Intervel >= 28 && Intervel <= 30:
// fmt.Println("1 MONTH")
// case Intervel > 30 && Intervel <= 60:
// fmt.Println("2 MONTH")
// default:
// fmt.Println("error")
// }
// }
// fmt.Println("MembershiplevelList", MembershiplevelList)
MembershiplevelLists, _, _ := MembershipConfig.MembershipLevelsList(0, Limit, memship.Filter{}, TenantId)
if err != nil {
log.Fatal("membership level list error", err)
c.AbortWithError(500, err)
}
var paginationendcount = len(MembershiplevelList) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(pageno, int(TotalMembershipLevelCount), limt)
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
_, TabName, _ := ModuleRouteName(c)
// fmt.Println("menus::", menu.NameLength)
c.HTML(200, "membershiplevel.html", gin.H{"csrf": csrf.GetToken(c), "Pagination": PaginationData{
NextPage: pageno + 1,
PreviousPage: pageno - 1,
TotalPages: PageCount,
TwoAfter: pageno + 2,
TwoBelow: pageno - 2,
ThreeAfter: pageno + 3,
}, "Menu": menu, "title": "Membership", "Searchtrue": filterflag, "Membershiplevellist": MembershiplevelLists, "Count": TotalMembershipLevelCount, "Previous": Previous, "Next": Next, "Page": Page, "Limit": limt, "PageCount": PageCount, "CurrentPage": pageno, "Paginationstartcount": paginationstartcount, "Filters": filter.Keyword, "Paginationendcount": paginationendcount, "linktitle": "Membership Level", "translate": translate, "Tabmenu": TabName, "Membershiplist": MembershiplevelList, "Filter": filter})
}
}
func Newsubscriptionlevel(c *gin.Context) {
var filter memship.Filter
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipLevel authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipLevel authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
DefaultTemplate := MembershipConfig.GetdefaultMembershiplevelTemplate()
subscriptiongroup, _ := MembershipConfig.MembershipGroupList(0, 0, filter, TenantId, 1)
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
_, TabName, _ := ModuleRouteName(c)
c.HTML(200, "createsubscriptionlevel.html", gin.H{"csrf": csrf.GetToken(c), "endpoint": "/admin/membershiplevel/createmembershiplevel", "action": "Save", "Menu": menu, "title": "Membership", "linktitle": "Create Membership Level", "translate": translate, "Tabmenu": TabName, "Defaulmembershiplevel": DefaultTemplate, "SubscriptionGroupList": subscriptiongroup})
}
}
func LoadMembershipTemplate(c *gin.Context) {
membershiplevelId, _ := strconv.Atoi(c.DefaultQuery("membershipid", ""))
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipLevel authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipLevel authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
membershipLevel, err := MembershipConfig.MembershiplevelDetails(membershiplevelId)
if err != nil {
log.Fatal("Master default Membership level error", err)
c.AbortWithStatusJSON(500, err)
}
c.JSON(200, gin.H{"SelectedMembership": membershipLevel})
}
}
func Editmembershiplevel(c *gin.Context) {
var filter memship.Filter
Membershipis, _ := strconv.Atoi(c.Query("Id"))
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipLevel authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipLevel authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
GetEditMembership, err := MembershipConfig.MembershiplevelEdit(Membershipis, TenantId)
if err != nil {
log.Fatal("Edit membership level error", err)
// c.AbortWithError(500, err)
}
subscriptiongroup, _ := MembershipConfig.MembershipGroupList(0, 0, filter, TenantId, 1)
for _,Group:=range subscriptiongroup{
if GetEditMembership.MembergroupLevelId==Group.Id{
GetEditMembership.GroupId=Group.Id
GetEditMembership.GroupName=Group.GroupName
}
}
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
_, TabName, _ := ModuleRouteName(c)
c.HTML(200, "createsubscriptionlevel.html", gin.H{"csrf": csrf.GetToken(c), "endpoint": "/admin/membershiplevel/updatembershiplevel", "action": "Update", "Tabmenu": TabName, "linktitle": "Edit Membership Level", "translate": translate, "Menu": menu, "title": "Membership", "SelectedMembership": GetEditMembership, "SubscriptionGroupList": subscriptiongroup})
}
}
func CreateMembershipLevels(c *gin.Context) {
SubscriptionGroupid, _ := strconv.Atoi(c.PostForm("subscriptiongroupid"))
isRecurringInt, _ := strconv.Atoi(c.PostForm("isrecurring"))
isdiscount, _ := strconv.Atoi(c.PostForm("Discount"))
discountpercentage, _ := strconv.Atoi(c.PostForm("discountpercentage"))
discountedprice := c.PostForm("discountedprice")
DiscountedPrice, _ := strconv.ParseFloat(discountedprice, 64)
initialPayment := c.PostForm("initialpayment")
InitialPayment, _ := strconv.ParseFloat(initialPayment, 64)
billingAmount := c.PostForm("billingamount")
BillingAmount, _ := strconv.ParseFloat(billingAmount, 64)
billingfrequentvalue, _ := strconv.Atoi(c.PostForm("billingfrequentvalue"))
billingcyclelimit, _ := strconv.Atoi(c.PostForm("billingcyclelimit"))
customtrial, _ := strconv.Atoi(c.PostForm("customtrial"))
customtriallimit, _ := strconv.Atoi(c.PostForm("trialbillinglimit"))
trirbillingamount := c.PostForm("trirbillingamount")
Trirbillingamount, _ := strconv.ParseFloat(trirbillingamount, 64)
billingfrequenttype, _ := strconv.Atoi(c.PostForm("billingfrequenttype"))
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipLevel authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipLevel authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
// isactive, _ := strconv.Atoi(c.PostForm("subscriptionactive"))
if isRecurringInt != 1 {
BillingAmount = 0.00
billingfrequentvalue = 0
billingcyclelimit = 0
billingfrequenttype = 0
}
if customtrial != 1 {
Trirbillingamount = 0.00
customtriallimit = 0
}
subscriptionlevel := memship.TblMstrMembershiplevel{
SubscriptionName: c.PostForm("subscriptionname"),
Description: c.PostForm("subscriptiondescription"),
MembershiplevelDetails: c.PostForm("subscriptiondesc"),
MembergroupLevelId: SubscriptionGroupid,
InitialPayment: InitialPayment,
IsDiscount: isdiscount,
DiscountPercentage: discountpercentage,
DiscountedAmount: DiscountedPrice,
RecurrentSubscription: isRecurringInt,
BillingAmount: BillingAmount,
BillingfrequentValue: billingfrequentvalue,
BillingfrequentType: billingfrequenttype,
BillingCyclelimit: billingcyclelimit,
CustomTrial: customtrial,
TrialBillingAmount: Trirbillingamount,
TrialBillingLimit: customtriallimit,
IsActive: 1,
}
err := MembershipConfig.MembershipLevelsCreate(subscriptionlevel, TenantId)
if err != nil {
log.Fatal("Membership level create error", err)
c.AbortWithError(500, err)
}
c.SetCookie("get-toast", "MembershiplevelCreatedSuccessfully", 3600, "", "", false, false)
c.Redirect(301, "/admin/membershiplevel")
}
}
func UpdateSubscriptionLevel(c *gin.Context) {
userid := c.GetInt("userid")
SubscriptionId, _ := strconv.Atoi(c.PostForm("subscriptionid"))
SubscriptionGroupid, _ := strconv.Atoi(c.PostForm("subscriptiongroupid"))
isRecurringInt, _ := strconv.Atoi(c.PostForm("isrecurring"))
isdiscount, _ := strconv.Atoi(c.PostForm("Discount"))
discountpercentage, _ := strconv.Atoi(c.PostForm("discountpercentage"))
discountedprice := c.PostForm("discountedprice")
DiscountedPrice, _ := strconv.ParseFloat(discountedprice, 64)
initialPayment := c.PostForm("initialpayment")
InitialPayment, _ := strconv.ParseFloat(initialPayment, 64)
billingAmount := c.PostForm("billingamount")
BillingAmount, _ := strconv.ParseFloat(billingAmount, 64)
billingfrequentvalue, _ := strconv.Atoi(c.PostForm("billingfrequentvalue"))
billingcyclelimit, _ := strconv.Atoi(c.PostForm("billingcyclelimit"))
customtrial, _ := strconv.Atoi(c.PostForm("customtrial"))
customtriallimit, _ := strconv.Atoi(c.PostForm("trialbillinglimit"))
trirbillingamount := c.PostForm("trirbillingamount")
Trirbillingamount, _ := strconv.ParseFloat(trirbillingamount, 64)
billingfrequenttype, _ := strconv.Atoi(c.PostForm("billingfrequenttype"))
isactive, _ := strconv.Atoi(c.PostForm("subscriptionactive"))
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipLevel authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipLevel authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
if isRecurringInt != 1 {
BillingAmount = 0.00
billingfrequentvalue = 0
billingcyclelimit = 0
billingfrequenttype = 0
}
if customtrial != 1 {
Trirbillingamount = 0.00
customtriallimit = 0
}
subscriptionupdate := memship.TblMstrMembershiplevel{
Id: SubscriptionId,
SubscriptionName: c.PostForm("subscriptionname"),
Description: c.PostForm("subscriptiondescription"),
MembershiplevelDetails: c.PostForm("subscriptiondesc"),
MembergroupLevelId: SubscriptionGroupid,
InitialPayment: InitialPayment,
IsDiscount: isdiscount,
DiscountPercentage: discountpercentage,
DiscountedAmount: DiscountedPrice,
RecurrentSubscription: isRecurringInt,
BillingAmount: BillingAmount,
BillingfrequentValue: billingfrequentvalue,
BillingfrequentType: billingfrequenttype,
BillingCyclelimit: billingcyclelimit,
CustomTrial: customtrial,
TrialBillingAmount: Trirbillingamount,
TrialBillingLimit: customtriallimit,
IsActive: isactive,
ModifiedBy: userid,
}
err := MembershipConfig.UpdateSubscription(subscriptionupdate, TenantId)
if err != nil {
log.Fatal("Membership level update error", err)
c.AbortWithError(500, err)
}
c.SetCookie("get-toast", "MembershiplevelUpdatedSuccessfully", 3600, "", "", false, false)
c.Redirect(301, "/admin/membershiplevel")
}
}
func DeleteSubscriptionLevel(c *gin.Context) {
userid := c.GetInt("userid")
subscriptionid, _ := strconv.Atoi(c.Query("Id"))
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipLevel authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipLevel authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
err := MembershipConfig.SubscriptionDelete(TenantId, subscriptionid, userid)
if err != nil {
log.Fatal("Membership level Delete error", err)
c.AbortWithError(500, err)
}
c.SetCookie("get-toast", "MembershiplevelDeletedSuccessfully", 3600, "", "", false, false)
c.Redirect(301, "/admin/membershiplevel")
}
}
func MultiselectDeletemembershipLevel(c *gin.Context) {
userid := c.GetInt("userid")
pageno := c.PostForm("page")
MembershipLevelids := c.PostFormArray("membershiplevelids[]")
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipLevel authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipLevel authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
MembershipLevelIntIds := make([]int, len(MembershipLevelids))
for i, id := range MembershipLevelids {
intId, _ := strconv.Atoi(id)
MembershipLevelIntIds[i] = intId
}
err := MembershipConfig.DeleteMultiselectMembershipLevel(MembershipLevelIntIds, userid)
if err != nil {
log.Fatal("Membership level multiple Delete error", err)
c.AbortWithError(500, err)
}
var filter memship.Filter
_, TotalMembershipLevelCount, err := MembershipConfig.MembershipLevelsList(0, 0, memship.Filter(filter), TenantId)
if err != nil {
log.Fatal("Membership level count error", err)
c.AbortWithError(500, err)
}
var url string
if pageno != "" {
page, _ := strconv.Atoi(pageno)
page = page - 1
multi := page * 10
multiInt64 := int64(multi)
if TotalMembershipLevelCount > multiInt64 {
url = "/admin/membershiplevel?page=" + pageno
} else {
pagee, _ := strconv.Atoi(pageno)
_page := pagee - 1
pages := strconv.Itoa(_page)
url = "/admin/membershiplevel?page=" + pages
}
} else {
url = "/admin/membershiplevel/"
}
c.JSON(200, gin.H{"value": true, "url": url})
}
}
func MembershipLevelIsactive(c *gin.Context) {
userid := c.GetInt("userid")
id, _ := strconv.Atoi(c.Request.PostFormValue("id"))
val, _ := strconv.Atoi(c.Request.PostFormValue("isactive"))
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipLevel authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipLevel authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
flg, err := MembershipConfig.ChangesMembershipLevelIsactive(id, val, userid, TenantId)
if err != nil {
ErrorLog.Printf("membership level status change error: %s", err)
json.NewEncoder(c.Writer).Encode(flg)
} else {
json.NewEncoder(c.Writer).Encode(flg)
}
c.JSON(200, gin.H{"value": true})
}
}
@@ -0,0 +1,295 @@
package controllers
import (
"encoding/json"
"fmt"
"strconv"
"strings"
// "strings"
"github.com/gin-gonic/gin"
"github.com/spurtcms/auth"
memship "github.com/spurtcms/membership"
csrf "github.com/utrack/gin-csrf"
)
func ListMembershipgroup(c *gin.Context) {
var (
limt int
offset int
filter memship.Filter
)
//get data from html url query
limit := c.Query("limit")
pageno, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
filter.Keyword = strings.Trim(c.DefaultQuery("keyword", ""), " ")
filter.Status = strings.Trim(c.DefaultQuery("status", ""), " ")
filter.ToDate = strings.Trim(c.DefaultQuery("lastupdated", ""), " ")
var filterflag bool
if filter.Keyword != "" {
filterflag = true
} else {
filterflag = false
}
if limit == "" {
limt = Limit
} else {
limt, _ = strconv.Atoi(limit)
}
if pageno != 0 {
offset = (pageno - 1) * limt
}
// flag := false
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipLevelGroup authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipLevelGroup authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
var Finalsubscriptiongroup []memship.TblMstrMembergrouplevel
subscriptiongroup, TotalGroupcount := MembershipConfig.MembershipGroupList(offset, limt, memship.Filter(filter), TenantId, 0)
fmt.Println("")
for _, val := range subscriptiongroup {
if !val.ModifiedOn.IsZero() {
val.DateString = val.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
val.DateString = val.CreatedOn.In(TZONE).Format(Datelayout)
}
Finalsubscriptiongroup = append(Finalsubscriptiongroup, val)
}
var paginationendcount = len(subscriptiongroup) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(pageno, int(TotalGroupcount), limt)
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
_, TabName, _ := ModuleRouteName(c)
c.HTML(200, "membershipgroup.html", gin.H{"csrf": csrf.GetToken(c), "Pagination": PaginationData{
NextPage: pageno + 1,
PreviousPage: pageno - 1,
TotalPages: PageCount,
TwoAfter: pageno + 2,
TwoBelow: pageno - 2,
ThreeAfter: pageno + 3,
}, "endpoint": "/admin/membershipgroup/createmembershiplevelgroup", "SubscriptionGroupList": Finalsubscriptiongroup, "Menu": menu, "title": "Membership", "linktitle": "Membership Group", "translate": translate, "Tabmenu": TabName, "Count": TotalGroupcount, "Previous": Previous, "Next": Next, "Page": Page, "Limit": limt, "Filter": filter, "Paginationstartcount": paginationstartcount, "Paginationendcount": paginationendcount, "Searchtrue": filterflag, "PageCount": PageCount, "CurrentPage": pageno, "Filters": filter.Keyword, "HeadTitle": translate.Memberss.Members, "Membermenu": true, "membermenu": true})
}
}
func CreateMembershipGroupLevel(c *gin.Context) {
userid := c.GetInt("userid")
GroupName := c.PostForm("plangroupname")
Description := c.PostForm("plangroupdesc")
// IsActive, _ := strconv.Atoi(c.PostForm("groupactive"))
IsActive := 1
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipLevelGroup authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipLevelGroup authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
MembershipConfig.MembershipGroupLevelCreate(GroupName, Description, IsActive, TenantId, userid)
c.SetCookie("get-toast", "MembershiplevelGroupCreatedSuccessfully", 3600, "", "", false, false)
c.Redirect(301, "/admin/membershipgroup")
}
}
func EditMembershipGroupLevel(c *gin.Context) {
membershiplecelgroupID, _ := strconv.Atoi(c.Query("Id"))
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipLevelGroup authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipLevelGroup authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
Membershipgroupdata := MembershipConfig.MembershipGroupLevelEdit(membershiplecelgroupID)
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
_, TabName, _ := ModuleRouteName(c)
c.HTML(200, "membershipgroup.html", gin.H{"csrf": csrf.GetToken(c), "endpoint": "/admin/membershipgroup/updatemembershiplevelgroup", "MembershipgroupUpdatedata": Membershipgroupdata, "Menu": menu, "title": "Membership", "linktitle": "Create MembershipGroup", "translate": translate, "Tabmenu": TabName})
}
}
func UpdateMembershipGroups(c *gin.Context) {
userid := c.GetInt("userid")
SubscriptionId, _ := strconv.Atoi(c.PostForm("membershipgroupid"))
GroupName := c.PostForm("plangroupname")
Description := c.PostForm("plangroupdesc")
IsActive, _ := strconv.Atoi(c.PostForm("groupactive"))
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipLevelGroup authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipLevelGroup authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
MembershipConfig.MembershipGrupUpdate(GroupName, Description, IsActive, TenantId, userid, SubscriptionId)
c.SetCookie("get-toast", "MembershiplevelGroupUpdatedSuccessfully", 3600, "", "", false, false)
c.Redirect(301, "/admin/membershipgroup")
}
}
func DeleteMembershipGroup(c *gin.Context) {
userid := c.GetInt("userid")
Membershipgroupid, _ := strconv.Atoi(c.Query("Id"))
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipLevelGroup authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipLevelGroup authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
MembershipConfig.MembershipGroupDelete(Membershipgroupid, userid, TenantId)
c.SetCookie("get-toast", "MembershiplevelGroupDeletedSuccessfully", 3600, "", "", false, false)
c.Redirect(301, "/admin/membershipgroup")
}
}
func MultiselectDeleteMembershipGroup(c *gin.Context) {
userid := c.GetInt("userid")
pageno := c.PostForm("page")
MembershipGroupIds := c.PostFormArray("membershipgroupids[]")
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipLevelGroup authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipLevelGroup authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
MembershipGroupIntIds := make([]int, len(MembershipGroupIds))
for i, id := range MembershipGroupIds {
intId, _ := strconv.Atoi(id)
MembershipGroupIntIds[i] = intId
}
MembershipConfig.DeleteMultiselectMembershipGroup(MembershipGroupIntIds, userid)
var filter memship.Filter
_, TolatmembershipGroupCount := MembershipConfig.MembershipGroupList(0, 0, memship.Filter(filter), TenantId, 0)
var url string
if pageno != "" {
page, _ := strconv.Atoi(pageno)
page = page - 1
multi := page * 10
multiInt64 := int64(multi)
if TolatmembershipGroupCount > multiInt64 {
url = "/admin/membershipgroup?page=" + pageno
} else {
pagee, _ := strconv.Atoi(pageno)
_page := pagee - 1
pages := strconv.Itoa(_page)
url = "/admin/membershipgroup?page=" + pages
}
} else {
url = "/admin/membershipgroup/"
}
c.JSON(200, gin.H{"value": true, "url": url})
}
}
func MembershipGroupIsactive(c *gin.Context) {
userid := c.GetInt("userid")
id, _ := strconv.Atoi(c.Request.PostFormValue("id"))
val, _ := strconv.Atoi(c.Request.PostFormValue("isactive"))
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipLevelGroup authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipLevelGroup authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
flg, err := MembershipConfig.ChangeMembershipGroupStatus(id, val, userid, TenantId)
if err != nil {
ErrorLog.Printf("membership group level status change error: %s", err)
json.NewEncoder(c.Writer).Encode(flg)
} else {
json.NewEncoder(c.Writer).Encode(flg)
}
}
}
+412
View File
@@ -0,0 +1,412 @@
package controllers
import (
"encoding/json"
"fmt"
storagecontroller "spurt-cms/storage-controller"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
"github.com/spurtcms/auth"
membership "github.com/spurtcms/membership"
memship "github.com/spurtcms/membership"
csrf "github.com/utrack/gin-csrf"
)
func MembershipMemberList(c *gin.Context) {
var (
limt int
offset int
filter memship.Filter
)
//get data from html url query
limit := c.Query("limit")
pageno, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
filter.Keyword = strings.Trim(c.DefaultQuery("keyword", ""), " ")
filter.Level = strings.Trim(c.DefaultQuery("filter-level", ""), " ")
filter.FromDate = strings.Trim(c.DefaultQuery("startdate", ""), " ")
var filterflag bool
if filter.Keyword != "" {
filterflag = true
} else {
filterflag = false
}
if limit == "" {
limt = Limit
} else {
limt, _ = strconv.Atoi(limit)
}
if pageno != 0 {
offset = (pageno - 1) * limt
}
flag := false
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("Membershipmembers authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("Membershipmembers authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
var FinalMembershipMemberList []memship.TblMembershipMembers
MembershipMemberList, TolatmemberCount := MembershipConfig.MembershipListMembers(offset, limt, memship.Filter(filter), flag, TenantId)
for _, val := range MembershipMemberList {
ExpiryDays := val.PlanDuration * val.MultiplyDuration
paymenton := val.EndDate
if !paymenton.IsZero() {
val.EndDate = paymenton.Add(time.Duration(ExpiryDays) * 24 * time.Hour)
val.DateStringend = val.EndDate.In(TZONE).Format(Datelayout)
val.DateString = paymenton.In(TZONE).Format(Datelayout)
}
FinalMembershipMemberList = append(FinalMembershipMemberList, val)
}
MembershiplevelList, _, _ := MembershipConfig.MembershipLevelsList(0, Limit, membership.Filter{}, TenantId)
var paginationendcount = len(MembershipMemberList) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(pageno, int(TolatmemberCount), limt)
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
_, TabName, _ := ModuleRouteName(c)
storagetype, err := GetSelectedType()
if err != nil {
fmt.Printf("member list getting storagetype error: %s", err)
}
uper, _ := NewAuth.IsGranted("Member", auth.Update, TenantId)
dper, _ := NewAuth.IsGranted("Member", auth.Delete, TenantId)
c.HTML(200, "memberss.html", gin.H{"csrf": csrf.GetToken(c), "Pagination": PaginationData{
NextPage: pageno + 1,
PreviousPage: pageno - 1,
TotalPages: PageCount,
TwoAfter: pageno + 2,
TwoBelow: pageno - 2,
ThreeAfter: pageno + 3,
}, "Menu": menu, "endpoint": "/admin/membership/newmember", "Count": TolatmemberCount, "Previous": Previous, "Next": Next, "Page": Page, "Limit": limt, "Filter": filter, "Paginationstartcount": paginationstartcount, "Paginationendcount": paginationendcount, "MemberList": FinalMembershipMemberList, "Searchtrue": filterflag, "PageCount": PageCount, "CurrentPage": pageno, "Filters": filter.Keyword, "title": "Membership", "linktitle": "Membership", "HeadTitle": translate.Memberss.Members, "translate": translate, "Membermenu": true, "membermenu": true, "Tabmenu": TabName, "StorageType": storagetype.SelectedType, "permission": uper, "dpermission": dper, "Membershiplevellist": MembershiplevelList})
}
}
func MembershipCreateMember(c *gin.Context) {
userid := c.GetInt("userid")
IsActive, _ := strconv.Atoi(c.PostForm("mem_activestatus"))
imagedata := c.PostForm("memcrop_base64")
var imageName, imagePath string
storagetype, err := GetSelectedType()
if err != nil {
ErrorLog.Printf("error get storage type error: %s", err)
}
if storagetype.SelectedType == "local" {
if imagedata != "" {
imageName, imagePath, err = ConvertBase64(imagedata, strings.TrimPrefix(storagetype.Local+"/member", "/"))
if err != nil {
ErrorLog.Printf("error get storage type error: %s", err)
}
}
} else if storagetype.SelectedType == "aws" {
tenantDetails, err := NewTeam.GetTenantDetails(TenantId)
if err != nil {
fmt.Println(err)
}
var imageByte []byte
if imagedata != "" {
imageName, imagePath, imageByte, err = ConvertBase64toByte(imagedata, "member")
if err != nil {
fmt.Println(err)
}
imagePath = tenantDetails.S3FolderName + imagePath
uerr := storagecontroller.UploadCropImageS3(imageName, imagePath, imageByte)
if uerr != nil {
c.SetCookie("Alert-msg", "ERRORAWScredentialsnotfound", 3600, "", "", false, false)
c.Redirect(301, "/admin/membership/")
return
}
}
}
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("Membershipmembers authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("Membershipmembers authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
MembershipMember := memship.TblMembershipMembers{
FirstName: c.PostForm("mem_name"),
LastName: c.PostForm("mem_lname"),
Email: c.PostForm("mem_email"),
MobileNo: c.PostForm("mem_mobile"),
ProfileImage: imageName,
ProfileImagePath: imagePath,
IsActive: IsActive,
Username: c.PostForm("mem_usrname"),
Password: c.PostForm("mem_pass"),
CreatedBy: userid,
StorageType: storagetype.SelectedType,
TenantId: TenantId,
}
MembershipConfig.CreateMembershipMembers(MembershipMember)
c.SetCookie("get-toast", "MembershipMemberCreatedSuccessfully", 3600, "", "", false, false)
}
c.Redirect(301, "/admin/membership/")
}
func MembershipEditMember(c *gin.Context) {
MemberId, _ := strconv.Atoi(c.DefaultQuery("id", ""))
EditMember := MembershipConfig.EditMembershipMember(MemberId)
c.JSON(200, gin.H{"EditMember": EditMember, "endpoint": "/admin/membership/updatemember"})
}
func MembershipUpdateMember(c *gin.Context) {
userid := c.GetInt("userid")
pageno := c.Query("page")
IsActive, _ := strconv.Atoi(c.PostForm("mem_activestatus"))
MemberId, _ := strconv.Atoi(c.PostForm("Update_memberid"))
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("Membershipmembers authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("Membershipmembers authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
MembershipMember := memship.TblMembershipMembers{
Id: MemberId,
FirstName: c.PostForm("mem_name"),
LastName: c.PostForm("mem_lname"),
Email: c.PostForm("mem_email"),
MobileNo: c.PostForm("mem_mobile"),
// ProfileImage: imageName,
// ProfileImagePath: imagePath,
IsActive: IsActive,
Username: c.PostForm("mem_usrname"),
Password: c.PostForm("mem_pass"),
CreatedBy: userid,
TenantId: TenantId,
}
MembershipConfig.UpdateMembershipMember(MembershipMember)
var filter memship.Filter
_, TolatmemberCount := MembershipConfig.MembershipListMembers(0, 0, memship.Filter(filter), false, TenantId)
var url string
if pageno != "" {
page, _ := strconv.Atoi(pageno)
page = page - 1
multi := page * 10
multiInt64 := int64(multi)
if TolatmemberCount > multiInt64 {
url = "/admin/membership?page=" + pageno
} else {
pagee, _ := strconv.Atoi(pageno)
_page := pagee - 1
pages := strconv.Itoa(_page)
url = "/admin/membership?page=" + pages
}
} else {
url = "/admin/membership/"
}
c.SetCookie("get-toast", "MembershipMemberUpdaredSuccessfully", 3600, "", "", false, false)
c.Redirect(301, url)
}
}
func MembershipDeleteMember(c *gin.Context) {
pageno := c.Query("page")
userid := c.GetInt("userid")
MemberId, _ := strconv.Atoi(c.Query("Id"))
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("Membershipmembers authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("Membershipmembers authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
MembershipConfig.DeleteMembershipMember(MemberId, userid)
var filter memship.Filter
_, TolatmemberCount := MembershipConfig.MembershipListMembers(0, 0, memship.Filter(filter), false, TenantId)
var url string
if pageno != "" {
page, _ := strconv.Atoi(pageno)
page = page - 1
multi := page * 10
multiInt64 := int64(multi)
if TolatmemberCount > multiInt64 {
url = "/admin/membership?page=" + pageno
} else {
pagee, _ := strconv.Atoi(pageno)
_page := pagee - 1
pages := strconv.Itoa(_page)
url = "/admin/membership?page=" + pages
}
} else {
url = "/admin/membership/"
}
c.SetCookie("get-toast", "MembershipMemberDeletedSuccessfully", 3600, "", "", false, false)
c.Redirect(301, url)
}
}
func MultiselectDeleteMember(c *gin.Context) {
userid := c.GetInt("userid")
pageno := c.PostForm("page")
MemberIds := c.PostFormArray("membersids[]")
MemberIntIds := make([]int, len(MemberIds))
for i, id := range MemberIds {
intId, _ := strconv.Atoi(id)
MemberIntIds[i] = intId
}
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("Membershipmembers authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("Membershipmembers authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
MembershipConfig.DeleteMultiselectMember(MemberIntIds, userid)
var filter memship.Filter
_, TolatmemberCount := MembershipConfig.MembershipListMembers(0, 0, memship.Filter(filter), false, TenantId)
var url string
if pageno != "" {
page, _ := strconv.Atoi(pageno)
page = page - 1
multi := page * 10
multiInt64 := int64(multi)
if TolatmemberCount > multiInt64 {
url = "/admin/membership?page=" + pageno
} else {
pagee, _ := strconv.Atoi(pageno)
_page := pagee - 1
pages := strconv.Itoa(_page)
url = "/admin/membership?page=" + pages
}
} else {
url = "/admin/membership/"
}
c.JSON(200, gin.H{"value": true, "url": url})
}
}
func MembershipIsactive(c *gin.Context) {
userid := c.GetInt("userid")
id, _ := strconv.Atoi(c.Request.PostFormValue("id"))
val, _ := strconv.Atoi(c.Request.PostFormValue("isactive"))
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("Membershipmembers authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("Membershipmembers authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
flg, err := MembershipConfig.ChangeMembershipStatus(id, val, userid, TenantId)
if err != nil {
ErrorLog.Printf("membership status change error: %s", err)
json.NewEncoder(c.Writer).Encode(flg)
} else {
json.NewEncoder(c.Writer).Encode(flg)
}
}
}
@@ -0,0 +1,448 @@
package controllers
import (
"fmt"
"log"
"strconv"
"strings"
"github.com/gin-gonic/gin"
"github.com/spurtcms/auth"
membership "github.com/spurtcms/membership"
memship "github.com/spurtcms/membership"
csrf "github.com/utrack/gin-csrf"
)
func Subscription(c *gin.Context) {
var (
limt int
offset int
filter memship.Filter
)
//get data from html url query
limit := c.Query("limit")
pageno, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
filter.Keyword = strings.Trim(c.DefaultQuery("keyword", ""), " ")
filter.Gateway = c.Query("gateway")
filter.Level = c.Query("filter-level")
filter.TransactionId = c.Query("transactionid")
var filterflag bool
if filter.Keyword != "" {
filterflag = true
} else {
filterflag = false
}
if limit == "" {
limt = Limit
} else {
limt, _ = strconv.Atoi(limit)
}
if pageno != 0 {
offset = (pageno - 1) * limt
}
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipSubscription authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipSubscription authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
MembershiplevelList, _, _ := MembershipConfig.MembershipLevelsList(0, 0, membership.Filter{}, TenantId)
SubscriptionList, SubscriptioCount, err := MembershipConfig.SubscriptionList(offset, limt, memship.Filter(filter), TenantId)
var FinalSubscriptionList []memship.TblMembershipSubcriptions
if err != nil {
log.Fatal("Subscription List Error :", err)
c.AbortWithError(500, err)
}
for _, val := range SubscriptionList {
if !val.ModifiedOn.IsZero() {
val.DateString = val.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
val.DateString = val.CreatedOn.In(TZONE).Format(Datelayout)
}
FinalSubscriptionList = append(FinalSubscriptionList, val)
}
var paginationendcount = len(SubscriptionList) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(pageno, int(SubscriptioCount), limt)
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
_, TabName, _ := ModuleRouteName(c)
c.HTML(200, "subscription.html", gin.H{"csrf": csrf.GetToken(c), "Pagination": PaginationData{
NextPage: pageno + 1,
PreviousPage: pageno - 1,
TotalPages: PageCount,
TwoAfter: pageno + 2,
TwoBelow: pageno - 2,
ThreeAfter: pageno + 3,
}, "Menu": menu, "title": "Membership", "Searchtrue": filterflag, "Count": SubscriptioCount, "Previous": Previous, "Next": Next, "Page": Page, "Limit": limt, "PageCount": PageCount, "CurrentPage": pageno, "Paginationstartcount": paginationstartcount, "Filters": filter, "Paginationendcount": paginationendcount, "linktitle": "Subscription", "translate": translate, "Tabmenu": TabName, "SubscriptionList": FinalSubscriptionList, "MembershiplevelList": MembershiplevelList})
}
}
func AddNewSubscription(c *gin.Context) {
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipSubscription authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipSubscription authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
MembershipMemberList, _ := MembershipConfig.MembershipListMembers(0, 0, membership.Filter{}, false, TenantId)
MembershiplevelList, _, _ := MembershipConfig.MembershipLevelsList(0, 0, membership.Filter{}, TenantId)
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
_, TabName, _ := ModuleRouteName(c)
c.HTML(200, "createsubscription.html", gin.H{"csrf": csrf.GetToken(c), "action": "Save", "Menu": menu, "title": "Membership", "linktitle": "Create Subscription", "translate": translate, "Tabmenu": TabName, "Membershiplevellist": MembershiplevelList, "endpoint": "/admin/subscription/createmembershipsubscription", "MembershipMemberList": MembershipMemberList})
}
}
func CreateMembershipSubscription(c *gin.Context) {
userid := c.GetInt("userid")
SubscriptionTransactionId := c.PostForm("subscriptiontransactionid")
Gateway := c.PostForm("gateway")
GatewayEnvironment := c.PostForm("gatewayenvironment")
Userid, _ := strconv.Atoi(c.PostForm("userid"))
MembershipLevelId, _ := strconv.Atoi(c.PostForm("membershiplevelid"))
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipSubscription authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipSubscription authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
var CreateSubscription = membership.TblMembershipSubcriptions{
MemberId: Userid,
MembershipLevelId: MembershipLevelId,
Gateway: Gateway,
GatewayEnvironment: GatewayEnvironment,
SubscriptionTransactionId: SubscriptionTransactionId,
IsActive: 1,
}
err := MembershipConfig.MembershipCreateSubscription(CreateSubscription, TenantId, userid)
if err != nil {
log.Fatal("Create Subscription Error :", err)
c.AbortWithError(500, err)
}
c.SetCookie("get-toast", "SubscriptionCreatedSuccessfully", 3600, "", "", false, false)
c.Redirect(301, "/admin/subscription")
}
}
func EditSubscription(c *gin.Context) {
SubscriptionId, _ := strconv.Atoi(c.DefaultQuery("Id", ""))
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipSubscription authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipSubscription authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
EditSubscription, err := MembershipConfig.SubscriptionEdit(SubscriptionId, TenantId)
if err != nil {
log.Fatal("SubscriptionEdit Error:", err)
c.AbortWithError(500, err)
}
MembershipMemberList, _ := MembershipConfig.MembershipListMembers(0, Limit, membership.Filter{}, false, TenantId)
MembershiplevelList, _, _ := MembershipConfig.MembershipLevelsList(0, Limit, membership.Filter{}, TenantId)
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
_, TabName, _ := ModuleRouteName(c)
c.HTML(200, "createsubscription.html", gin.H{"csrf": csrf.GetToken(c), "action": "Update", "Menu": menu, "title": "Membership", "linktitle": "Edit Subscription", "translate": translate, "Tabmenu": TabName, "EditSubscription": EditSubscription, "endpoint": "/admin/subscription/updatesubscription", "Membershiplevellist": MembershiplevelList, "MembershipMemberList": MembershipMemberList})
}
}
func UpdateSubscription(c *gin.Context) {
pageno := c.Query("page")
userid := c.GetInt("userid")
subscriptionid, _ := strconv.Atoi(c.PostForm("subscriptionid"))
SubscriptionTransactionId := c.PostForm("subscriptiontransactionid")
Gateway := c.PostForm("gateway")
GatewayEnvironment := c.PostForm("gatewayenvironment")
Userid, _ := strconv.Atoi(c.PostForm("userid"))
MembershipLevelId, _ := strconv.Atoi(c.PostForm("membershiplevelid"))
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipSubscription authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipSubscription authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
var UpdateSubscription = membership.TblMembershipSubcriptions{
Id: subscriptionid,
MemberId: Userid,
MembershipLevelId: MembershipLevelId,
Gateway: Gateway,
GatewayEnvironment: GatewayEnvironment,
SubscriptionTransactionId: SubscriptionTransactionId,
}
err := MembershipConfig.SubscriptionUpdate(UpdateSubscription, userid, TenantId)
if err != nil {
log.Fatal("Subscription Update error:", err)
c.AbortWithError(500, err)
}
var filter memship.Filter
_, SubscriptioCount, err := MembershipConfig.SubscriptionList(0, 0, memship.Filter(filter), TenantId)
var url string
if pageno != "" {
page, _ := strconv.Atoi(pageno)
page = page - 1
multi := page * 10
multiInt64 := int64(multi)
if SubscriptioCount > multiInt64 {
url = "/admin/subscription?page=" + pageno
} else {
pagee, _ := strconv.Atoi(pageno)
_page := pagee - 1
pages := strconv.Itoa(_page)
url = "/admin/subscription?page=" + pages
}
} else {
url = "/admin/subscription/"
}
c.SetCookie("get-toast", "SubscriptionUpdaredSuccessfully", 3600, "", "", false, false)
c.Redirect(301, url)
}
}
func Deletesubscription(c *gin.Context) {
pageno := c.Query("page")
userid := c.GetInt("userid")
SubscriptionId, _ := strconv.Atoi(c.Query("Id"))
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipSubscription authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipSubscription authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
err := MembershipConfig.SubscriptionsDelete(SubscriptionId, userid, TenantId)
if err != nil {
log.Fatal("Subscription Delete error:", err)
c.AbortWithError(500, err)
}
var filter memship.Filter
_, SubscriptioCount, err := MembershipConfig.SubscriptionList(0, 0, memship.Filter(filter), TenantId)
var url string
if pageno != "" {
page, _ := strconv.Atoi(pageno)
page = page - 1
multi := page * 10
multiInt64 := int64(multi)
if SubscriptioCount > multiInt64 {
url = "/admin/subscription?page=" + pageno
} else {
pagee, _ := strconv.Atoi(pageno)
_page := pagee - 1
pages := strconv.Itoa(_page)
url = "/admin/subscription?page=" + pages
}
} else {
url = "/admin/subscription/"
}
c.SetCookie("get-toast", "SubscriptionDeletedSuccessfully", 3600, "", "", false, false)
c.Redirect(301, url)
}
}
func SubscriptionIsactive(c *gin.Context) {
userid := c.GetInt("userid")
id, _ := strconv.Atoi(c.Request.PostFormValue("id"))
val, _ := strconv.Atoi(c.Request.PostFormValue("isactive"))
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipSubscription authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipSubscription authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
_, err := MembershipConfig.ChangesSubscriptionIsactive(id, val, userid, TenantId)
if err != nil {
log.Fatal("Subscription Update Issue :", err)
c.AbortWithStatusJSON(500, err)
}
fmt.Println("reachh::")
c.JSON(200, gin.H{"value": true})
}
}
func MultiSelectDeleteSubscription(c *gin.Context) {
fmt.Println("multi deleted::")
userid := c.GetInt("userid")
pageno := c.PostForm("page")
SubsriptionIds := c.PostFormArray("subsriptionids[]")
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipSubscription authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipSubscription authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
SubscriptionIntIds := make([]int, len(SubsriptionIds))
for i, id := range SubsriptionIds {
intId, _ := strconv.Atoi(id)
SubscriptionIntIds[i] = intId
}
err := MembershipConfig.DeleteMultiSelectSubscription(SubscriptionIntIds, userid)
if err != nil {
log.Fatal("Membership Subscription Delete error", err)
// c.AbortWithError(500, err)
}
var filter memship.Filter
_, SubscriptioCount, err := MembershipConfig.SubscriptionList(0, 0, memship.Filter(filter), TenantId)
if err != nil {
log.Fatal("Membership level count error", err)
c.AbortWithError(500, err)
}
var url string
if pageno != "" {
page, _ := strconv.Atoi(pageno)
page = page - 1
multi := page * 10
multiInt64 := int64(multi)
if SubscriptioCount > multiInt64 {
url = "/admin/subscription?page=" + pageno
} else {
pagee, _ := strconv.Atoi(pageno)
_page := pagee - 1
pages := strconv.Itoa(_page)
url = "/admin/subscription?page=" + pages
}
} else {
url = "/admin/subscription/"
}
c.JSON(200, gin.H{"value": true, "url": url})
}
}
+673
View File
@@ -0,0 +1,673 @@
package controllers
import (
"log"
"os"
"spurt-cms/config"
"spurt-cms/models"
"strings"
"time"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
type SubModule struct {
Id int
ModuleName string
IconPath string
Routes []URL
// FullAccessPermission bool
Action bool
}
type URL struct {
Id int
DisplayName string
RouteName string
}
type MenuMod struct {
Id int
ParentId int
ModuleName string
IconPath string
Routes []URL // this is for single menu multiple permissions arr
HrefRoute URL
Route string //this is for a tag href route
SubModule []SubModule // this is for submodules
// FullAccessPermission bool
EmptyCheck bool //this is flg for mainmenu hide if submodule is empty
}
type TablePageType struct {
Id int
Title string
Slug string
CreatedBy int
CreatedOn time.Time
ModifiedBy int
ModifiedOn time.Time
DeletedBy int
DeletedOn time.Time
IsDeleted int
}
type USR struct {
TblModule []MenuMod
Name string
NameLength int
LimitedLengthName string
RoleName string
ProfileImagePath string
Languages []models.TblLanguage
DefaultLanguage models.TblLanguage
CurrentLanguage models.TblLanguage
Personalize models.TblUserPersonalize
Footer string
NameString string
Expand bool
LogoPath string
ExpandLogoPath string
TblPageTypes []TablePageType
ChannelID int
LastUpdatedOn string
WebsiteUrl string
}
type TblModulePermission struct {
Id int
RouteName string
DisplayName string
SlugName string
Description string
ModuleId int
CreatedBy int
CreatedOn time.Time
CreatedDate string `gorm:"-"`
ModifiedBy int `gorm:"DEFAULT:NULL"`
ModifiedOn time.Time `gorm:"DEFAULT:NULL"`
ModuleName string `gorm:"<-:false"`
FullAccessPermission int
ParentId int
AssignPermission int
BreadcrumbName string
TblRolePermission []TblRolePermission `gorm:"<-:false; foreignKey:PermissionId"`
OrderIndex int
}
type TblRolePermission struct {
Id int
RoleId int
PermissionId int
CreatedBy int
CreatedOn time.Time
CreatedDate string `gorm:"<-:false"`
}
type TblModule struct {
Id int
ModuleName string
IsActive int
CreatedBy int
CreatedOn time.Time
CreatedDate string `gorm:"<-:false"`
DefaultModule int
ParentId int
IconPath string
OrderIndex int
TblModulePermission []TblModulePermission `gorm:"<-:false; foreignKey:ModuleId"`
Description string
DisplayName string `gorm:"column:display_name;<-:false"`
RouteName string `gorm:"column:route_name;<-:false"`
RouteParentId int `gorm:"column:parent_id;<-:false"`
FullAccessPermission int
GroupFlg int
}
func GetLanguageList() []models.TblLanguage {
var languagelist []models.TblLanguage
err := models.FetchAllLanguage(&languagelist, TenantId)
if err != nil {
ErrorLog.Printf("Fectch all language error: %s", err)
return []models.TblLanguage{}
}
for _, langlist := range languagelist {
_, err := os.Stat(langlist.JsonPath)
if err != nil {
log.Println(err)
return []models.TblLanguage{}
}
}
return languagelist
}
func MainMenu() []TblModule {
var parentModules []TblModule
GetAllParentModule(&parentModules) //get parent default main module only
return parentModules
}
func GetPageType() []TablePageType {
var pagetypes []TablePageType
GetDefaultPagetypes(&pagetypes) //get parent default main module only
return pagetypes
}
func TabMenu(parentid int) []TblModule {
var subModules []TblModule
GetAllSubModule(&subModules, parentid)
return subModules
}
func NewMenuController(c *gin.Context) USR {
userid := c.GetInt("userid")
var (
permissionid []int
Final []MenuMod
personalize_data models.TblUserPersonalize
firstn string
lastn string
expandflg bool
currentLanguage models.TblLanguage
)
user, _, _ := NewTeamWP.GetUserById(userid, []int{})
rolepermission, err := GetPermissionIDS(user.RoleId)
pagetype := GetPageType()
if err != nil {
log.Println(err)
}
for _, val := range rolepermission {
permissionid = append(permissionid, val.PermissionId)
}
LeftMain := MainMenu()
for _, val := range LeftMain {
var fin MenuMod
fin.Id = val.Id
fin.ModuleName = val.ModuleName
fin.IconPath = val.IconPath
TabManu := TabMenu(val.Id)
var Suball []SubModule
if user.RoleId != 1 && user.RoleId != 2 { //not admin users
for _, tab := range TabManu {
var sub SubModule
sub.Id = tab.Id
sub.ModuleName = tab.ModuleName
sub.IconPath = tab.IconPath
var (
Url []URL
rout []TblModulePermission
flg bool
)
GetModulePermissions(&rout, tab.Id, permissionid)
for _, url := range rout {
if strings.Contains(url.RouteName, "/entries/entrylist/") {
flg = true
break
}
}
for _, url := range rout {
if url.ModuleId == tab.Id {
if url.RouteName != "/entries/entrylist" {
var urll URL
if strings.Contains(url.RouteName, "/entries/entrylist/") {
url.RouteName = "/entries/entrylist"
}
urll.Id = url.Id
urll.DisplayName = url.DisplayName
urll.RouteName = url.RouteName
Url = append(Url, urll)
} else if flg && url.RouteName == "/entries/entrylist" {
var urll URL
urll.Id = url.Id
urll.DisplayName = url.DisplayName
urll.RouteName = url.RouteName
Url = append(Url, urll)
}
}
}
if flg {
var urll URL
urll.DisplayName = "Entries"
urll.RouteName = "/entries/entrylist"
Url = append(Url, urll)
}
sub.Routes = Url
Suball = append(Suball, sub)
}
} else {
for _, tab := range TabManu {
if tab.ParentId == val.Id {
var sub SubModule
sub.Id = tab.Id
sub.ModuleName = tab.ModuleName
sub.IconPath = tab.IconPath
var rout []TblModulePermission
GetModulePermissions(&rout, tab.Id, []int{})
var Url []URL
for _, url := range rout {
var urll URL
urll.Id = url.Id
urll.DisplayName = url.DisplayName
urll.RouteName = url.RouteName
Url = append(Url, urll)
}
sub.Routes = Url
Suball = append(Suball, sub)
}
}
}
if len(Suball) > 0 && len(Suball[0].Routes) > 0 {
fin.Route = Suball[0].Routes[0].RouteName
}
for _, val := range Suball {
if len(val.Routes) != 0 {
fin.Route = val.Routes[0].RouteName
break
}
}
fin.SubModule = Suball
Final = append(Final, fin)
}
// for _, val := range Final {
// fmt.Println(val)
// fmt.Println()
// }
models.GetPersonalize(&personalize_data, userid, TenantId)
var first = user.FirstName
var last = user.LastName
if first != "" {
firstn = strings.ToUpper(first[:1])
}
if user.LastName != "" {
lastn = strings.ToUpper(last[:1])
}
var nameLength = len(user.FirstName) + len(user.LastName)
user.NameLength = nameLength
if nameLength > 18 {
if len(first) > 6 {
user.LimitedLengthName = first[:5] + "..."
} else {
user.LimitedLengthName = first[:len(first)] + "..."
}
}
var Name = firstn + lastn
user.NameString = Name
if user.ProfileImagePath != "" {
if user.StorageType == "local" {
user.ProfileImagePath = "/" + user.ProfileImagePath
} else if user.StorageType == "aws" {
user.ProfileImagePath = "/image-resize?name=" + user.ProfileImagePath
}
}
if interfaceValue, exists := c.Get("currentLanguage"); exists {
if structValue, ok := interfaceValue.(models.TblLanguage); ok {
currentLanguage = structValue
}
}
session1, _ := c.Cookie("mainmenu")
if session1 != "" {
expandflg = true
} else {
expandflg = false
}
tblGeneralSettings, _ := models.GetGeneralSettings(TenantId)
if !strings.Contains(tblGeneralSettings.LogoPath, "/public/img") {
if tblGeneralSettings.StorageType == "aws" {
LogoPath = "/image-resize?name=" + tblGeneralSettings.LogoPath
ExpantLogoPath = "/image-resize?name=" + tblGeneralSettings.ExpandLogoPath
} else if tblGeneralSettings.StorageType == "local" {
LogoPath = "Storage/" + tblGeneralSettings.LogoPath
ExpantLogoPath = "Storage/" + tblGeneralSettings.ExpandLogoPath
}
} else {
LogoPath = tblGeneralSettings.LogoPath
}
var ChannelId int
channelist, clerr := ChannelConfig.GetPermissionChannel(TenantId)
if clerr != nil {
ErrorLog.Printf(" Entry listchannel error: %s", clerr)
}
if len(channelist) != 0 {
selectedchannel := channelist[len(channelist)-1]
ChannelId = selectedchannel.Id
}
Mod := USR{
TblModule: Final,
Name: user.FirstName + " " + user.LastName,
NameLength: user.NameLength,
LimitedLengthName: user.LimitedLengthName,
RoleName: user.RoleName,
ProfileImagePath: user.ProfileImagePath,
Languages: GetLanguageList(),
// DefaultLanguage: GetDefaultLanguageDetails(userid),
Personalize: personalize_data,
CurrentLanguage: currentLanguage,
Footer: os.Getenv("COPYRIGHTS"),
NameString: user.NameString,
Expand: expandflg,
LogoPath: LogoPath,
ExpandLogoPath: ExpantLogoPath,
TblPageTypes: pagetype,
ChannelID: ChannelId,
LastUpdatedOn: LastUpdatedTime,
WebsiteUrl: os.Getenv("WEBSITE_URL"),
}
return Mod
}
func GetPermissionIDS(roleid int) ([]TblRolePermission, error) {
var perm []TblRolePermission
err := GetPermissionId(&perm, roleid)
if err != nil {
log.Println(err)
return []TblRolePermission{}, err
}
return perm, nil
}
var db = config.SetupDB()
/**/
func GetAllParentModule(modules *[]TblModule) error {
if err := db.Table("tbl_modules").Where("default_module = 0 and parent_id = 0").Order("tbl_modules.order_index asc").Find(&modules).
Error; err != nil {
return err
}
return nil
}
func GetAllSubModules(modules *[]TblModule, parentId []int) error {
if err := db.Table("tbl_modules").Where("parent_id in (?)", parentId).Order("tbl_modules.order_index asc").Find(&modules).
Error; err != nil {
return err
}
return nil
}
func GetAllSubModule(modules *[]TblModule, moduleid int) error {
if err := db.Table("tbl_modules").Where("parent_id = (?) and menu_type='tab'", moduleid).Order("tbl_modules.order_index asc").Find(&modules).
Error; err != nil {
return err
}
return nil
}
func GetModulePermissions(permission *[]TblModulePermission, modid int, ids []int) error {
query := db.Table("tbl_module_permissions").Select("tbl_module_permissions.*,tbl_modules.module_name").Joins("inner join tbl_modules on tbl_modules.id = tbl_module_permissions.module_id").Order("tbl_modules.order_index asc,tbl_module_permissions.order_index asc")
if len(ids) > 0 {
query = query.Where("tbl_module_permissions.id in (?)", ids)
}
if modid != 0 && modid > -1 {
query = query.Where("module_id = (?)", modid)
}
query.Find(&permission)
if err := query.Error; err != nil {
return err
}
return nil
}
/*Get PermissionId By RoleId*/
func GetPermissionId(perm *[]TblRolePermission, roleid int) error {
if err := db.Model(TblRolePermission{}).Where("role_id=?", roleid).Find(&perm).Error; err != nil {
return err
}
return nil
}
/**/
func GetAllParentModules1(mod *[]TblModule) (err error) {
if err := DB.Model(TblModule{}).Where("parent_id=0 and (tenant_id is NULL or tenant_id = ?)", TenantId).Order("order_index asc").Find(&mod).Error; err != nil {
return err
}
return nil
}
/**/
func GetDefaultPagetypes(mod *[]TablePageType) (err error) {
if err := DB.Table("tbl_page_types").Where("is_deleted=0").Find(&mod).Error; err != nil {
return err
}
return nil
}
/**/
func GetAllSubModules1(mod *[]TblModule, ids []int) (err error) {
if err := DB.Debug().Model(TblModule{}).Where("(tbl_modules.parent_id in (?) or id in(?)) and tbl_modules.assign_permission=0 and (tenant_id is NULL or tenant_id = ?)", ids, ids, TenantId).Order("order_index").Preload("TblModulePermission", func(db *gorm.DB) *gorm.DB {
return db.Where("assign_permission =1 and tenant_id is NULL or tenant_id = ?", TenantId).Order("order_index asc")
}).Find(&mod).Error; err != nil {
return err
}
return nil
}
func Permissions() []TblModule {
var (
allmodule []TblModule
allmodules []TblModule
parentid []int //all parentid
submod []TblModule
)
GetAllParentModules1(&allmodule)
for _, val := range allmodule {
parentid = append(parentid, val.Id)
}
GetAllSubModules1(&submod, parentid)
for _, val := range allmodule {
if val.GroupFlg == 1 {
var newmod TblModule
newmod.Id = val.Id
newmod.Description = val.Description
newmod.CreatedBy = val.CreatedBy
newmod.ModuleName = val.ModuleName
newmod.IsActive = val.IsActive
newmod.IconPath = val.IconPath
newmod.CreatedDate = val.CreatedOn.Format("02 Jan 2006 03:04 PM")
for _, sub := range submod {
if sub.ParentId == val.Id {
for _, getmod := range sub.TblModulePermission {
if getmod.ModuleId == sub.Id {
var modper TblModulePermission
modper.Id = getmod.Id
modper.Description = getmod.Description
modper.DisplayName = getmod.DisplayName
modper.ModuleName = getmod.ModuleName
modper.RouteName = getmod.RouteName
modper.CreatedBy = getmod.CreatedBy
modper.Description = getmod.Description
modper.TblRolePermission = getmod.TblRolePermission
modper.CreatedDate = val.CreatedOn.Format("2006-01-02 15:04:05")
modper.FullAccessPermission = getmod.FullAccessPermission
newmod.TblModulePermission = append(newmod.TblModulePermission, modper)
}
}
}
}
allmodules = append(allmodules, newmod)
} else {
for _, sub := range submod {
if sub.ParentId == val.Id {
var newmod TblModule
newmod.Id = sub.Id
newmod.Description = sub.Description
newmod.CreatedBy = sub.CreatedBy
newmod.ModuleName = sub.ModuleName
newmod.IsActive = sub.IsActive
newmod.IconPath = sub.IconPath
newmod.CreatedDate = sub.CreatedOn.Format("02 Jan 2006 03:04 PM")
for _, getmod := range sub.TblModulePermission {
if getmod.ModuleId == sub.Id {
var modper TblModulePermission
modper.Id = getmod.Id
modper.Description = sub.Description
modper.DisplayName = getmod.DisplayName
modper.ModuleName = getmod.ModuleName
modper.RouteName = getmod.RouteName
modper.CreatedBy = getmod.CreatedBy
modper.Description = getmod.Description
modper.TblRolePermission = getmod.TblRolePermission
modper.CreatedDate = val.CreatedOn.Format("2006-01-02 15:04:05")
modper.FullAccessPermission = getmod.FullAccessPermission
newmod.TblModulePermission = append(newmod.TblModulePermission, modper)
}
}
allmodules = append(allmodules, newmod)
}
}
}
}
return allmodules
}
+456
View File
@@ -0,0 +1,456 @@
package controllers
import (
"fmt"
"strconv"
"strings"
"github.com/gin-gonic/gin"
"github.com/spurtcms/auth"
membership "github.com/spurtcms/membership"
csrf "github.com/utrack/gin-csrf"
)
func OrderList(c *gin.Context) {
var filter membership.Filter
var limt int
var offset int
limit := c.Query("limit")
pageno, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
filter.Keyword = strings.Trim(c.DefaultQuery("keyword", ""), " ")
filter.OrderId, _ = strconv.Atoi(strings.Trim(c.DefaultQuery("orderid", ""), " "))
filter.TransactionId = strings.Trim(c.DefaultQuery("transactionid", ""), " ")
filter.Level = strings.Trim(c.DefaultQuery("filter-level", ""), " ")
//Search--datas
var searchflag bool
if filter.Keyword != "" {
searchflag = true
} else {
searchflag = false
}
//Filter--datat
var filterflag bool
if filter.Level != "" || filter.OrderId != 0 || filter.TransactionId != "" {
filterflag = true
} else {
filterflag = false
}
if limit == "" {
limt = Limit
} else {
limt, _ = strconv.Atoi(limit)
}
if pageno != 0 {
offset = (pageno - 1) * limt
}
permisison, perr := NewAuth.IsGranted("Membership", auth.Create, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipOrder authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipOrder authorization error")
c.Redirect(301, "/403-page")
return
}
var FinalOrderList []membership.TblMembershipOrders
var TotalCount int64
MembershiplevelList, _, _ := MembershipConfig.MembershipLevelsList(0, 0, membership.Filter{}, TenantId)
orderlist, count, err := MembershipConfig.OrderList(limt, offset, filter, TenantId)
if err != nil {
fmt.Println(err)
}
TotalCount = count
if permisison {
for _, val := range orderlist {
if !val.ModifiedOn.IsZero() {
val.DateString = val.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
val.DateString = val.CreatedOn.In(TZONE).Format(Datelayout)
}
FinalOrderList = append(FinalOrderList, val)
}
}
//pagination calc
paginationendcount := len(orderlist) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(pageno, int(TotalCount), limt)
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
_, TabName, _ := ModuleRouteName(c)
c.HTML(200, "orders.html", gin.H{"Pagination": PaginationData{
NextPage: pageno + 1,
PreviousPage: pageno - 1,
TotalPages: PageCount,
TwoAfter: pageno + 2,
TwoBelow: pageno - 2,
ThreeAfter: pageno + 3,
}, "csrf": csrf.GetToken(c), "Menu": menu, "Searchtrue": searchflag, "Filtertrue": filterflag, "title": "Membership", "linktitle": "Orders", "translate": translate, "Tabmenu": TabName, "Orderlist": FinalOrderList, "Count": TotalCount, "Paginationendcount": paginationendcount, "Previous": Previous, "Next": Next, "PageCount": PageCount, "CurrentPage": pageno, "Page": Page, "Filter": filter, "Paginationstartcount": paginationstartcount, "Limit": limt, "Membershiplevellist": MembershiplevelList})
}
func Createorder(c *gin.Context) {
MembershiplevelList, _, _ := MembershipConfig.MembershipLevelsList(0, 0, membership.Filter{}, TenantId)
SubscriptionList, _, _ := MembershipConfig.SubscriptionList(0, 0, membership.Filter{}, TenantId)
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
_, TabName, _ := ModuleRouteName(c)
c.HTML(200, "createorder.html", gin.H{"csrf": csrf.GetToken(c), "Menu": menu, "title": "Membership", "linktitle": "Create Order", "translate": translate, "Tabmenu": TabName, "Membershiplevellist": MembershiplevelList, "SubscriptionList": SubscriptionList})
}
func AddOrder(c *gin.Context) {
userid := c.GetInt("userid")
memberuserid, _ := strconv.Atoi(c.PostForm("userid"))
membershiplevelid, _ := strconv.Atoi(c.PostForm("membershiplevelid"))
billingname := c.PostForm("billingname")
billingstreet := c.PostForm("billingstreet")
billingstreet2 := c.PostForm("billingstreet2")
billingcity := c.PostForm("billingcity")
billingstate := c.PostForm("billingstate")
billingpostalcode := c.PostForm("billingpostalcode")
billingcountry := c.PostForm("billingcountry")
billingphone := c.PostForm("billingphone")
subtotal, _ := strconv.Atoi(c.PostForm("subtotal"))
tax, _ := strconv.Atoi(c.PostForm("tax"))
total := c.PostForm("total")
paymenttype := c.PostForm("paymenttype")
status := c.PostForm("status")
gateway := c.PostForm("gateway")
gatewayenvironment := c.PostForm("gatewayenvironment")
paymenttransactionid, _ := strconv.Atoi(c.PostForm("paymenttransactionid"))
subscriptiontransactionid, _ := strconv.Atoi(c.PostForm("subscriptiontransactionid"))
permisison, perr := NewAuth.IsGranted("Membership", auth.Create, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipOrder authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipOrder authorization error")
c.Redirect(301, "/403-page")
return
}
Order := membership.TblMembershipOrder{
UserId: memberuserid,
MembershiplevelId: membershiplevelid,
BillingName: billingname,
BillingStreet: billingstreet,
BillingStreet2: billingstreet2,
BillingCity: billingcity,
BillingState: billingstate,
BillingPostalcode: billingpostalcode,
BillingCountry: billingcountry,
BillingPhone: billingphone,
SubTotal: subtotal,
Tax: tax,
Total: total,
PaymentType: paymenttype,
Status: status,
Gateway: gateway,
GatewayEnvironment: gatewayenvironment,
PaymenttransactionId: paymenttransactionid,
SubscriptiontransactionId: subscriptiontransactionid,
CreatedBy: userid,
TenantId: TenantId,
}
if permisison {
err := MembershipConfig.CreateOrder(Order)
if err != nil {
fmt.Println(err)
c.Redirect(301, "/admin/order/")
return
}
}
c.SetCookie("get-toast", "Order Created Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/admin/order/")
}
func EditOrder(c *gin.Context) {
id, _ := strconv.Atoi(c.Param("id"))
permisison, perr := NewAuth.IsGranted("Membership", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipOrder authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipOrder authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
SubscriptionList, _, _ := MembershipConfig.SubscriptionList(0, 0, membership.Filter{}, TenantId)
MembershiplevelList, _, _ := MembershipConfig.MembershipLevelsList(0, 0, membership.Filter{}, TenantId)
orderlist, err := MembershipConfig.EditMembershipOrder(id, TenantId)
if err != nil {
fmt.Println(err)
}
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
_, TabName, _ := ModuleRouteName(c)
c.HTML(200, "createorder.html", gin.H{"csrf": csrf.GetToken(c), "Menu": menu, "title": "Membership", "linktitle": "Edit Order", "translate": translate, "Tabmenu": TabName, "orderlist": orderlist, "Membershiplevellist": MembershiplevelList, "SubscriptionList": SubscriptionList})
}
c.Redirect(301, "/403-page")
}
func UpdateOrder(c *gin.Context) {
userid := c.GetInt("userid")
id, _ := strconv.Atoi(c.PostForm("orderid"))
memberuserid, _ := strconv.Atoi(c.PostForm("userid"))
membershiplevelid, _ := strconv.Atoi(c.PostForm("membershiplevelid"))
billingname := c.PostForm("billingname")
billingstreet := c.PostForm("billingstreet")
billingstreet2 := c.PostForm("billingstreet2")
billingcity := c.PostForm("billingcity")
billingstate := c.PostForm("billingstate")
billingpostalcode := c.PostForm("billingpostalcode")
billingcountry := c.PostForm("billingcountry")
billingphone := c.PostForm("billingphone")
subtotal, _ := strconv.Atoi(c.PostForm("subtotal"))
tax, _ := strconv.Atoi(c.PostForm("tax"))
total := c.PostForm("total")
paymenttype := c.PostForm("paymenttype")
status := c.PostForm("status")
gateway := c.PostForm("gateway")
gatewayenvironment := c.PostForm("gatewayenvironment")
paymenttransactionid, _ := strconv.Atoi(c.PostForm("paymenttransactionid"))
subscriptiontransactionid, _ := strconv.Atoi(c.PostForm("subscriptiontransactionid"))
permisison, perr := NewAuth.IsGranted("Membership", auth.Update, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipOrder authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipOrder authorization error")
c.Redirect(301, "/403-page")
return
}
Order := membership.TblMembershipOrder{
UserId: memberuserid,
MembershiplevelId: membershiplevelid,
BillingName: billingname,
BillingStreet: billingstreet,
BillingStreet2: billingstreet2,
BillingCity: billingcity,
BillingState: billingstate,
BillingPostalcode: billingpostalcode,
BillingCountry: billingcountry,
BillingPhone: billingphone,
SubTotal: subtotal,
Tax: tax,
Total: total,
PaymentType: paymenttype,
Status: status,
Gateway: gateway,
GatewayEnvironment: gatewayenvironment,
PaymenttransactionId: paymenttransactionid,
SubscriptiontransactionId: subscriptiontransactionid,
ModifiedBy: userid,
}
if permisison {
err := MembershipConfig.UpdateMembershipOrder(Order, id, TenantId)
if err != nil {
fmt.Println(err)
c.Redirect(301, "/admin/order/")
return
}
}
c.SetCookie("get-toast", "Order Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/admin/order/")
}
func DeleteOrder(c *gin.Context) {
id, _ := strconv.Atoi(c.Param("id"))
pageno := c.Query("page")
userid := c.GetInt("userid")
var url string
permisison, perr := NewAuth.IsGranted("Membership", auth.Update, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipOrder authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipOrder authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
err := MembershipConfig.DeleteMembershipOrder(id, userid, TenantId)
if err != nil {
fmt.Println(err)
c.Redirect(301, "/403-page")
return
}
}
_, count, _ := MembershipConfig.OrderList(0, 0, membership.Filter{}, TenantId)
if pageno != "" {
page, _ := strconv.Atoi(pageno)
page = page - 1
multi := page * 10
multiInt64 := int64(multi)
if count > multiInt64 {
url = "/admin/order?page=" + pageno
} else {
pagee, _ := strconv.Atoi(pageno)
_page := pagee - 1
pages := strconv.Itoa(_page)
url = "/admin/order?page=" + pages
}
} else {
url = "/admin/order/"
}
c.SetCookie("get-toast", "Order Deleted Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, url)
}
func MultiSelectDeleteOrder(c *gin.Context) {
orderids := c.PostFormArray("orderids[]")
pageno := c.PostForm("page")
userid := c.GetInt("userid")
var url string
permisison, perr := NewAuth.IsGranted("Membership", auth.Update, TenantId)
if perr != nil {
ErrorLog.Printf("MembershipOrder authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("MembershipOrder authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
orderIntIds := make([]int, len(orderids))
for i, id := range orderids {
intId, _ := strconv.Atoi(id)
orderIntIds[i] = intId
}
err := MembershipConfig.MultiSelectDeleteOrder(orderIntIds, userid, TenantId)
if err != nil {
ErrorLog.Printf("MultiSelectOrderDelete error: %s", err)
c.JSON(200, gin.H{"value": false})
return
}
_, count, _ := MembershipConfig.OrderList(0, 0, membership.Filter{}, TenantId)
if pageno != "" {
page, _ := strconv.Atoi(pageno)
page = page - 1
multi := page * 10
multiInt64 := int64(multi)
if count > multiInt64 {
url = "/admin/order?page=" + pageno
} else {
pagee, _ := strconv.Atoi(pageno)
_page := pagee - 1
pages := strconv.Itoa(_page)
url = "/admin/order?page=" + pages
}
} else {
url = "/admin/order/"
}
c.JSON(200, gin.H{"value": true, "url": url})
}
}
+301
View File
@@ -0,0 +1,301 @@
package controllers
import (
"os"
newauth "github.com/spurtcms/auth"
"github.com/spurtcms/blocks"
cat "github.com/spurtcms/categories"
chn "github.com/spurtcms/channels"
courses "github.com/spurtcms/courses"
forms "github.com/spurtcms/forms-builders"
listing "github.com/spurtcms/listing"
mem "github.com/spurtcms/member"
memaccess "github.com/spurtcms/member-access"
memship "github.com/spurtcms/membership"
"github.com/spurtcms/menu"
menus "github.com/spurtcms/menu"
"github.com/spurtcms/team"
role "github.com/spurtcms/team-roles"
)
var (
NewAuth *newauth.Auth
NewTeam *team.Teams
NewTeamWP *team.Teams
NewRole *role.PermissionConfig
NewRoleWP *role.PermissionConfig
ChannelConfig *chn.Channel
ChannelConfigWP *chn.Channel
CategoryConfig *cat.Categories
MemberConfig *mem.Member
MemberConfigWP *mem.Member
MemberaccessConfig *memaccess.AccessControl
BlockConfig *blocks.Block
FormConfig *forms.Formbuilders
MembershipConfig *memship.Membership
CoursesConfig *courses.Courses
MenuConfig *menus.Menu
MenuConfigWp *menus.Menu
ListingConfig *listing.Listing
)
// AuthCofing
func AuthConfig() *newauth.Auth {
NewAuth = newauth.AuthSetup(newauth.Config{
SecretKey: os.Getenv("JWT_SECRET"),
DB: DB,
// DataBaseType: os.Getenv("DATABASE_TYPE"),
})
return NewAuth
}
// TeamConfig
func GetTeamInstance() *team.Teams {
NewTeam = team.TeamSetup(team.Config{
DB: DB,
AuthEnable: true,
PermissionEnable: true,
Auth: NewAuth,
// DataBaseType: os.Getenv("DATABASE_TYPE"),
})
return NewTeam
}
// TeamConfig
func GetTeamInstanceWithoutPermission() *team.Teams {
NewTeamWP = team.TeamSetup(team.Config{
DB: DB,
AuthEnable: false,
PermissionEnable: false,
Auth: NewAuth,
// DataBaseType: os.Getenv("DATABASE_TYPE"),
})
return NewTeamWP
}
// roles and permissions config
func GetRoleInstance() *role.PermissionConfig {
NewAuth.AuthFlg = true
NewAuth.PermissionFlg = true
NewRole = role.RoleSetup(role.Config{
DB: DB,
AuthEnable: true,
PermissionEnable: true,
Authenticate: NewAuth,
// DataBaseType: os.Getenv("DATABASE_TYPE"),
})
return NewRole
}
// roles and permissions without permission config
func GetRoleInstanceWithoutPermission() *role.PermissionConfig {
NewRoleWP = role.RoleSetup(role.Config{
DB: DB,
AuthEnable: false,
PermissionEnable: false,
Authenticate: NewAuth,
// DataBaseType: os.Getenv("DATABASE_TYPE"),
})
return NewRoleWP
}
// channel config
func GetChannelInstance() *chn.Channel {
ChannelConfig = chn.ChannelSetup(chn.Config{
DB: DB,
AuthEnable: true,
PermissionEnable: true,
Auth: NewAuth,
// DataBaseType: os.Getenv("DATABASE_TYPE"),
})
return ChannelConfig
}
// channel config without permission
func GetChannelInstanceWithoutPermission() *chn.Channel {
ChannelConfigWP = chn.ChannelSetup(chn.Config{
DB: DB,
AuthEnable: true,
PermissionEnable: false,
Auth: NewAuth,
// DataBaseType: os.Getenv("DATABASE_TYPE"),
})
return ChannelConfigWP
}
// Categoryconfig
func GetCategoryInstance() *cat.Categories {
CategoryConfig = cat.CategoriesSetup(cat.Config{
DB: db,
AuthEnable: true,
PermissionEnable: true,
Auth: NewAuth,
// DataBaseType: os.Getenv("DATABASE_TYPE"),
})
return CategoryConfig
}
// member config
func GetMemberInstance() *mem.Member {
MemberConfig = mem.MemberSetup(mem.Config{
DB: db,
AuthEnable: true,
PermissionEnable: true,
Auth: NewAuth,
// DataBaseType: os.Getenv("DATABASE_TYPE"),
})
return MemberConfig
}
// member config without permission
func GetMemberInstanceWithoutPermission() *mem.Member {
MemberConfigWP = mem.MemberSetup(mem.Config{
DB: db,
AuthEnable: true,
PermissionEnable: false,
Auth: NewAuth,
// DataBaseType: os.Getenv("DATABASE_TYPE"),
})
return MemberConfigWP
}
/*content access Config*/
func GetMemberaccessInstance() *memaccess.AccessControl {
MemberaccessConfig = memaccess.AccessSetup(memaccess.Config{
DB: db,
AuthEnable: true,
PermissionEnable: true,
Auth: NewAuth,
// DataBaseType: os.Getenv("DATABASE_TYPE"),
})
return MemberaccessConfig
}
func GetBlockInstance() *blocks.Block {
BlockConfig = blocks.BlockSetup(blocks.Config{
DB: DB,
AuthEnable: true,
PermissionEnable: false,
Auth: NewAuth,
})
return BlockConfig
}
func GetFormInstance() *forms.Formbuilders {
FormConfig = forms.FormSetup(forms.Config{
DB: DB,
AuthEnable: true,
PermissionEnable: false,
Auth: NewAuth,
})
return FormConfig
}
func GetMembershipInstance() *memship.Membership {
MembershipConfig = memship.MembershipSetup(memship.Config{
DB: DB,
AuthEnable: true,
PermissionEnable: false,
Auth: NewAuth,
})
return MembershipConfig
}
func GetCoursesInstance() *courses.Courses {
CoursesConfig = courses.CoursesSetup(courses.Config{
DB: DB,
AuthEnable: true,
PermissionEnable: false,
Auth: NewAuth,
})
return CoursesConfig
}
func GetListingInstance() *listing.Listing {
ListingConfig = listing.ListingSetup(listing.Config{
DB: DB,
AuthEnable: true,
PermissionEnable: false,
Auth: NewAuth,
})
return ListingConfig
}
func GetMenuInstrance() *menu.Menu {
MenuConfig = menu.MenuSetup(menu.Config{
DB: DB,
AuthEnable: true,
PermissionEnable: true,
Auth: NewAuth,
})
return MenuConfig
}
func GetMenuInstranceWithoutPermission() *menu.Menu {
MenuConfigWp = menu.MenuSetup(menu.Config{
DB: DB,
AuthEnable: true,
PermissionEnable: false,
Auth: NewAuth,
})
return MenuConfigWp
}
func PackageInitialize() {
AuthConfig()
GetTeamInstance()
GetRoleInstance()
GetChannelInstance()
GetCategoryInstance()
GetMemberInstance()
GetMemberaccessInstance()
GetTeamInstanceWithoutPermission()
GetRoleInstanceWithoutPermission()
GetMemberInstanceWithoutPermission()
GetChannelInstanceWithoutPermission()
GetCoursesInstance()
GetBlockInstance()
GetFormInstance()
GetMenuInstrance()
GetMenuInstranceWithoutPermission()
GetListingInstance()
GetMembershipInstance()
}
+498
View File
@@ -0,0 +1,498 @@
package controllers
import (
"encoding/json"
"fmt"
"strconv"
"strings"
"github.com/gin-gonic/gin"
nauth "github.com/spurtcms/auth"
role "github.com/spurtcms/team-roles"
csrf "github.com/utrack/gin-csrf"
)
/*Roles list*/
func RoleView(c *gin.Context) {
var (
limt int
offset int
NewModule []TblModule
)
//get values from html form data
limit := c.Query("limit")
pageno, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
keyword := c.Query("keyword")
var filterflag bool
if keyword != "" {
filterflag = true
} else {
filterflag = false
}
if limit == "" {
limt = Limit
} else {
limt, _ = strconv.Atoi(limit)
}
if pageno != 0 {
offset = (pageno - 1) * limt
}
permisison, perr := NewAuth.IsGranted("Roles & Permissions", nauth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("roleslist authorization error: %s", perr)
}
if !permisison {
c.Redirect(301, "/403-page")
return
}
NewRole.DataAccess = c.GetInt("dataaccess")
NewRole.UserId = c.GetInt("userid")
roles, rolecount, err := NewRole.RoleList(role.Rolelist{Limit: limt, Offset: offset, Filter: role.Filter{Keyword: keyword}}, TenantId, false)
if err != nil {
ErrorLog.Printf("roleslist error: %s", err)
}
var newroles []role.Tblrole
for _, val := range roles {
permissionid, err := NewRole.GetPermissionDetailsById(val.Id, TenantId)
if err != nil {
ErrorLog.Printf("roleslist permission details error: %s", err)
}
if len(permissionid) > 0 {
val.Slug = "Manage"
} else {
val.Slug = "Yettoconf"
}
if !val.ModifiedOn.IsZero() {
val.CreatedDate = val.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
val.CreatedDate = val.CreatedOn.In(TZONE).Format(Datelayout)
}
newroles = append(newroles, val)
}
/*Get module permission list*/
// var NewModule []role.Tblmodule
// Module, _, err := NewRole.PermissionListRoleId(100, 0, c.GetInt("role"), role.Filter{})
// if err != nil {
// ErrorLog.Printf("get permissionlist error: %s", err)
// }
Module := Permissions()
for _, val := range Module {
/*this is for display whitespcae remove */
val.Description = strings.ReplaceAll(val.ModuleName, " ", "")
NewModule = append(NewModule, val)
}
loguserid := c.GetInt("userid")
roleid := NewRole.GetRoleids(loguserid)
//pagination calc
paginationendcount := len(roles) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(pageno, int(rolecount), limt)
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
c.HTML(200, "rolesandpermission.html", gin.H{"Pagination": PaginationData{
NextPage: pageno + 1,
PreviousPage: pageno - 1,
TotalPages: PageCount,
TwoAfter: pageno + 2,
TwoBelow: pageno - 2,
ThreeAfter: pageno + 3,
}, "Menu": menu, "csrf": csrf.GetToken(c), "linktitle": "Roles & Permissions", "roleid": roleid, "Searchtrue": filterflag, "loguserid": loguserid, "HeadTitle": translate.Roles + " & " + translate.Permission.Permissions, "translate": translate, "roles": newroles, "Count": rolecount, "Paginationendcount": paginationendcount, "Paginationstartcount": paginationstartcount, "Previous": Previous, "Next": Next, "PageCount": PageCount, "Page": Page, "CurrentPage": pageno, "Module": NewModule, "Limit": limt, "keyword": keyword, "title": "Roles & Permissions", "SettingsHead": true, "Rolesmenu": true, "Tooltiptitle": translate.Setting.Rolestooltip})
}
/*Get data using id*/
func GetRolePermissionData(c *gin.Context) {
var roleid, _ = strconv.Atoi(c.Request.PostFormValue("id"))
role, err := NewRole.GetRoleById(roleid, TenantId)
if err != nil {
ErrorLog.Printf("get role details error: %s", err)
}
permissionid, perr := NewRole.GetPermissionDetailsById(roleid, TenantId)
if perr != nil {
ErrorLog.Printf("get permission details error: %s", perr)
}
json.NewEncoder(c.Writer).Encode(gin.H{"role": role, "permissionid": permissionid})
}
/*Roles Create or update*/
func RoleCreate(c *gin.Context) {
//get values from html form data
rolename := c.Request.PostFormValue("rolename")
description := c.Request.PostFormValue("roledesc")
permissionsid := c.PostFormArray("permissionid[]")
roleisactive:= c.Request.PostFormValue("roleisactive")
isactive, err := strconv.Atoi(roleisactive)
if err != nil {
panic(err)
}
var idi = []int{}
if len(permissionsid) > 0 {
//convert stringarray to intarray
for _, i := range permissionsid {
j, err := strconv.Atoi(i)
if err != nil {
panic(err)
}
idi = append(idi, j)
}
}
idi = append(idi, 1, 21)
userid := c.GetInt("userid")
fmt.Println("dtetet1")
permisison, perr := NewAuth.IsGranted("Roles & Permissions", nauth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("rolescreate authorization error: %s", perr)
}
if !permisison {
c.Redirect(301, "/403-page")
return
}
/*role created*/
roledetail, rerr := NewRole.CreateRole(role.RoleCreation{Name: rolename, Description: description, CreatedBy: userid, TenantId: TenantId},isactive)
if rerr != nil {
ErrorLog.Printf("rolescreate error: %s", rerr)
json.NewEncoder(c.Writer).Encode(rerr)
return
}
/*permission created*/
prerr := NewRole.CreatePermission(role.MultiPermissin{RoleId: roledetail.Id, Ids: idi, CreatedBy: userid, TenantId: TenantId})
if perr != nil {
ErrorLog.Printf("rolepermission create error: %s", prerr)
}
c.JSON(200, gin.H{"role": "added"})
}
/*Roles Create or update*/
func RoleUpdate(c *gin.Context) {
//get values from html form data
roleid, _ := strconv.Atoi(c.Request.PostFormValue("roleid"))
rolename := c.Request.PostFormValue("rolename")
description := c.Request.PostFormValue("roledesc")
permissionsid := c.PostFormArray("permissionid[]")
var idi = []int{}
if len(permissionsid) > 0 {
//convert stringarray to intarray
for _, i := range permissionsid {
j, err := strconv.Atoi(i)
if err != nil {
panic(err)
}
idi = append(idi, j)
}
}
idi = append(idi, 1, 21)
userid := c.GetInt("userid")
permisison, perr := NewAuth.IsGranted("Roles & Permissions", nauth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("rolesupdate authorization error: %s", perr)
}
if !permisison {
c.Redirect(301, "/403-page")
return
}
/*role update*/
roledetail, rerr := NewRole.UpdateRole(role.RoleCreation{Name: rolename, Description: description, CreatedBy: userid}, roleid, TenantId)
if rerr != nil {
ErrorLog.Printf("rolesupdate error: %s", perr)
json.NewEncoder(c.Writer).Encode(rerr)
return
}
/*permission created*/
prerr := NewRole.CreateUpdatePermission(role.MultiPermissin{RoleId: roledetail.Id, Ids: idi, CreatedBy: userid, TenantId: TenantId})
if perr != nil {
ErrorLog.Printf("rolepermission update error: %s", prerr)
}
c.JSON(200, gin.H{"role": "updated"})
}
/*Delete Role*/
func DeleteRole(c *gin.Context) {
//get values from html form data
var id, _ = strconv.Atoi(c.Query("id"))
pageno := c.Query("page")
var url string
if pageno != "" {
url = "/admin/settings/roles?page=" + pageno
} else {
url = "/admin/settings/roles/"
}
permisison, perr := NewAuth.IsGranted("Roles & Permissions", nauth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("rolesdelete authorization error: %s", perr)
}
if !permisison {
c.Redirect(301, "/403-page")
return
}
_, err := NewRole.DeleteRole([]int{}, id, TenantId)
if err != nil {
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
ErrorLog.Printf("rolesdelete authorization error: %s", err)
}
_, rolecount, err := NewRole.RoleList(role.Rolelist{Limit: 0, Offset: 0, Filter: role.Filter{Keyword: ""}}, TenantId, false)
if err != nil {
ErrorLog.Printf("roleslist error: %s", err)
}
recordsPerPage := Limit
totalPages := (int(rolecount) + recordsPerPage - 1) / recordsPerPage
currentPage := 1
if pageno != "" {
currentPage, _ = strconv.Atoi(pageno)
}
if currentPage > totalPages && totalPages > 0 {
url = "/admin/settings/roles?page=" + strconv.Itoa(totalPages)
}
c.SetCookie("get-toast", "Role Deleted Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, url)
}
/*Check Role Already Exists*/
func CheckRoleAlreadyExists(c *gin.Context) {
//get values from html form data
roleid, _ := strconv.Atoi(c.PostForm("id"))
Rolename := c.PostForm("name")
_, err := NewRole.CheckRoleAlreadyExists(roleid, Rolename, TenantId)
var role bool
if err != nil {
ErrorLog.Printf("check roles error: %s", err)
role = false
} else {
role = true
}
c.JSON(200, gin.H{"role": role})
}
/*permission role status*/
func RoleIsActive(c *gin.Context) {
//get values from html form data
id, _ := strconv.Atoi(c.Request.PostFormValue("id"))
val, _ := strconv.Atoi(c.Request.PostFormValue("isactive"))
userid := c.GetInt("userid")
err := NewRole.RoleStatus(id, val, userid, TenantId)
if err != nil {
ErrorLog.Printf("roles status error: %s", err)
json.NewEncoder(c.Writer).Encode(false)
} else {
json.NewEncoder(c.Writer).Encode(true)
}
}
// multiple role delete
func MultiselectRoleDelete(c *gin.Context) {
var (
roledata []map[string]string
roleids []int
)
if err := json.Unmarshal([]byte(c.Request.PostFormValue("roleids")), &roledata); err != nil {
ErrorLog.Printf("roles multiple delete unmarshall error: %s", err)
}
for _, val := range roledata {
roleid, _ := strconv.Atoi(val["roleid"])
roleids = append(roleids, roleid)
}
pageno := c.PostForm("page")
var url string
if pageno != "" {
url = "/admin/settings/roles?page=" + pageno
} else {
url = "/admin/settings/roles/"
}
permisison, perr := NewAuth.IsGranted("Roles & Permissions", nauth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("rolesmultiple delete authorization error: %s", perr)
}
if !permisison {
c.Redirect(301, "/403-page")
return
}
_, err := NewRole.DeleteRole(roleids, 0, TenantId)
if err != nil {
ErrorLog.Printf("rolesmultiple delete error: %s", err)
c.JSON(200, gin.H{"value": false})
return
}
_, rolecount, err := NewRole.RoleList(role.Rolelist{Limit: 0, Offset: 0, Filter: role.Filter{Keyword: ""}}, TenantId, false)
if err != nil {
ErrorLog.Printf("roleslist error: %s", err)
}
recordsPerPage := Limit
totalPages := (int(rolecount) + recordsPerPage - 1) / recordsPerPage
currentPage := 1
if pageno != "" {
currentPage, _ = strconv.Atoi(pageno)
}
if currentPage > totalPages && totalPages > 0 {
url = "/admin/settings/roles?page=" + strconv.Itoa(totalPages)
}
c.JSON(200, gin.H{"value": true, "url": url})
}
func MultiSelectRoleStatus(c *gin.Context) {
var roledata []map[string]string
if err := json.Unmarshal([]byte(c.Request.PostFormValue("roleids")), &roledata); err != nil {
fmt.Println(err)
}
var (
roleids []int
statusint int
status int
)
for _, val := range roledata {
roleid, _ := strconv.Atoi(val["roleid"])
statusint, _ = strconv.Atoi(val["status"])
if statusint == 0 {
status = 1
} else if statusint == 1 {
status = 0
}
roleids = append(roleids, roleid)
}
fmt.Println("state", status)
pageno := c.PostForm("page")
var url string
if pageno != "" {
url = "/admin/settings/roles?page=" + pageno
} else {
url = "/admin/settings/roles/"
}
userid := c.GetInt("userid")
permisison, perr := NewAuth.IsGranted("Roles & Permissions", nauth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("rolesmultiplestatus authorization error: %s", perr)
}
if !permisison {
c.Redirect(301, "/403-page")
return
}
err := NewRole.MultiSelectRoleStatus(roleids, status, userid, TenantId)
if err != nil {
ErrorLog.Printf("rolesmultiplestatus error: %s", err)
c.JSON(200, gin.H{"value": false})
return
}
c.SetCookie("get-toast", "Role Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.JSON(200, gin.H{"value": true, "status": status, "url": url})
}
func Chkroleshaveuser(c *gin.Context){
var (
rolesdata []map[string]string
rolesids []int
)
roles_id, _ := strconv.Atoi(c.PostForm("rolesid"))
if err := json.Unmarshal([]byte(c.Request.PostFormValue("roleids")), &rolesdata); err != nil {
fmt.Println(err)
}
for _, val := range rolesdata {
roleid, _ := strconv.Atoi(val["roleid"])
rolesids = append(rolesids, roleid)
}
_, err := NewRole.Rolescheckusers(roles_id,rolesids, TenantId)
if err != nil {
ErrorLog.Printf("Roles and permission check hane Error :%s", err)
c.JSON(200, gin.H{"value": false})
return
}
c.JSON(200, gin.H{"value": true})
}
+306
View File
@@ -0,0 +1,306 @@
package controllers
import (
"encoding/json"
"fmt"
"log"
"os"
storagecontroller "spurt-cms/storage-controller"
"strconv"
"strings"
"sync"
"github.com/gin-gonic/gin"
"github.com/spurtcms/team"
csrf "github.com/utrack/gin-csrf"
"golang.org/x/crypto/bcrypt"
)
func SettingView(c *gin.Context) {
menu := NewMenuController(c)
// fmt.Println("valmenemodule",menu.TblModule)
// for _,val:= range menu.TblModule{
// if val.ModuleName=="Settings"{
// for _,val2:=range val.SubModule{
// fmt.Println("valmenemodule",val2)
// }
// }
// }
translate, _ := TranslateHandler(c)
c.HTML(200, "settings.html", gin.H{"Menu": menu, "linktitle": "Settings", "csrf": csrf.GetToken(c), "translate": translate, "HeadTitle": translate.Settings, "title": "Settings"})
}
func MyProfile(c *gin.Context) {
users, _, err := NewTeamWP.GetUserById(c.GetInt("userid"), []int{})
if err != nil {
ErrorLog.Printf("get myprofile error : %s", err)
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.SetCookie("Alert-msg", "alert", 3600, "", "", false, false)
}
var first = users.FirstName
var last = users.LastName
var firstn = strings.ToUpper(first[:1])
var lastn string
if users.LastName != "" {
lastn = strings.ToUpper(last[:1])
}
if users.ProfileImagePath != "" {
if users.StorageType == "local" {
users.ProfileImagePath = "/" + users.ProfileImagePath
} else if users.StorageType == "aws" {
users.ProfileImagePath = "/image-resize?name=" + users.ProfileImagePath
}
}
var Name = firstn + lastn
users.NameString = Name
Role, err := NewRole.GetRoleById(users.RoleId, "")
if err != nil {
log.Println(err)
}
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
Folder, File, Media, _, _ := GetMedia()
selectedtype, _ := GetSelectedType()
c.HTML(200, "myaccount.html", gin.H{"Menu": menu, "title": "My Account", "linktitle": "My Account", "csrf": csrf.GetToken(c), "HeadTitle": translate.Myprofile, "translate": translate, "user": users, "rolename": Role.Name, "SettingsHead": true, "Myprofmenu": true, "Tooltiptitle": translate.Setting.Myprofiletooltip, "Folder": Folder, "File": File, "Media": Media, "StorageType": selectedtype.SelectedType})
}
func ChangePassword(c *gin.Context) {
translate, _ := TranslateHandler(c)
menu := NewMenuController(c)
c.HTML(200, "security.html", gin.H{"Menu": menu, "title": "Security", "linktitle": "Security", "csrf": csrf.GetToken(c), "translate": translate, "HeadTitle": translate.Setting.Security, "SettingsHead": true, "Changepassmenu": true, "Tooltiptitle": translate.Setting.Securitytooltip})
}
func UpdateProfile(c *gin.Context) {
if c.PostForm("user_fname") == "" || c.PostForm("user_email") == "" || c.PostForm("user_mob") == "" || c.PostForm("user_name") == "" {
c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/myprofile/")
return
}
var (
imgPath, imgName string
err error
)
storageType, err := GetSelectedType()
if err != nil {
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.SetCookie("Alert-msg", "alert", 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/myprofile/")
return
}
imagedata := c.PostForm("crop_data")
if strings.Contains(imagedata, "data:image/jpeg;base64") || strings.Contains(imagedata, "data:image/png;base64") || strings.Contains(imagedata, "data:image/svg+xml;base64") {
tenantDetails, err := NewTeam.GetTenantDetails(TenantId)
if err != nil {
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.SetCookie("Alert-msg", "alert", 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/myprofile/")
return
}
if storageType.SelectedType == "aws" {
var (
tempString, imageName string
imageByte []byte
)
imageName, tempString, imageByte, err = ConvertBase64toByte(imagedata, "user")
if err != nil {
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.SetCookie("Alert-msg", "alert", 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/myprofile/")
return
}
tempString = tenantDetails.S3FolderName + tempString
err = storagecontroller.UploadCropImageS3(imageName, tempString, imageByte)
if err != nil {
c.SetCookie("Alert-msg", "ERRORAWScredentialsnotfound", 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/myprofile/")
return
}
imgPath = tempString
imgName = imageName
} else if storageType.SelectedType == "local" {
var tempImgPath, imageName string
imageName, tempImgPath, err = ConvertBase64(imagedata, "storage/user")
if err != nil {
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.SetCookie("Alert-msg", "alert", 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/myprofile/")
return
}
imgPath = "/" + tempImgPath
imgName = imageName
}
} else {
imgPath = imagedata
}
userid, _ := strconv.Atoi(c.PostForm("id"))
Newuser := team.TeamCreate{
FirstName: c.PostForm("user_fname"),
LastName: c.PostForm("user_lname"),
Email: c.PostForm("user_email"),
MobileNo: c.PostForm("user_mob"),
Username: c.PostForm("user_name"),
ProfileImage: imgName,
ProfileImagePath: imgPath,
StorageType: storageType.SelectedType,
}
err = NewTeamWP.UpdateMyUser(Newuser, userid, TenantId)
if err != nil {
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.SetCookie("Alert-msg", "alert", 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/myprofile/")
return
}
c.SetCookie("get-toast", "My Profile Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/myprofile/")
}
func UptPassword(c *gin.Context) {
userid := c.GetInt("userid")
pswd := c.PostForm("pass")
cpswd := c.PostForm("cpass")
if pswd == "" && cpswd == "" && pswd != cpswd {
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/changepassword")
return
}
err, _ := NewTeamWP.ChangeYourPassword(pswd, userid, TenantId)
if strings.Contains(fmt.Sprint(err), "given some values is empty") {
c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/changepassword")
return
} else {
c.SetCookie("get-toast", "Password Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/changepassword")
}
id := c.GetInt("userid")
userdet, _, _ := NewTeamWP.GetUserById(id, []int{})
fname := userdet.FirstName
email := userdet.Email
var url_prefix = os.Getenv("BASE_URL")
// if os.Getenv("BASE_URL") != "" {
// url_prefix = os.Getenv("BASE_URL")
// } else {
// url_prefix = os.Getenv("DOMAIN_URL")
// }
data := map[string]interface{}{
"fname": fname,
"admin_logo": url_prefix + "public/img/spurtcms.png",
"fb_logo": url_prefix + "public/img/facebook.png",
"linkedin_logo": url_prefix + "public/img/linkedin.png",
"twitter_logo": url_prefix + "public/img/twitter.png",
}
var wg sync.WaitGroup
wg.Add(1)
Chan := make(chan string, 1)
go ChangePasswordEmail(Chan, &wg, data, email, "Changepassword")
close(Chan)
}
func CheckPassword(c *gin.Context) {
var Password bool
id := c.GetInt("userid")
pswd := c.PostForm("pass")
userdet, _, _ := NewTeamWP.GetUserById(id, []int{})
if strings.Contains(fmt.Sprint(userdet), "given some values is empty") {
json.NewEncoder(c.Writer).Encode(false)
return
}
passerr := bcrypt.CompareHashAndPassword([]byte(userdet.Password), []byte(pswd))
if passerr == bcrypt.ErrMismatchedHashAndPassword {
Password = false
} else {
Password = true
}
c.JSON(200, gin.H{"pass": Password})
}
File diff suppressed because it is too large Load Diff
+185
View File
@@ -0,0 +1,185 @@
package controllers
import (
"bytes"
"io"
"log"
"net/http"
"net/url"
"os"
"spurt-cms/models"
"github.com/gin-gonic/gin"
csrf "github.com/utrack/gin-csrf"
)
func Getsupport(c *gin.Context) {
CountryList, _ := models.GetCountryLIst()
menu := NewMenuController(c)
translate, _ := TranslateHandler(c)
timezones, err := models.GetTimeZones(TenantId)
if err != nil {
ErrorLog.Printf("Getting data from general settings Error:%s", err)
}
// ModuleName, TabName, _ := ModuleRouteName(c)
c.HTML(200, "support.html", gin.H{"csrf": csrf.GetToken(c), "Menu": menu, "translate": translate, "TimeZone": timezones, "CountryList": CountryList})
}
func Supportsubmited(c *gin.Context) {
status := c.Query("status")
var pament string
if status != "cancelled" {
pament = "Success"
} else {
pament = "Cancel"
}
menu := NewMenuController(c)
translate, _ := TranslateHandler(c)
// ModuleName, TabName, _ := ModuleRouteName(c)
c.HTML(200, "submited.html", gin.H{"csrf": csrf.GetToken(c), "Payment": pament, "Menu": menu, "translate": translate})
}
// func Sendsupportemail(c *gin.Context) {
// companyname := c.PostForm("companyname")
// contectemail := c.PostForm("contectemail")
// contectnumber := c.PostForm("contectnumber")
// timezone := c.PostForm("timezone")
// Country := c.PostForm("Country")
// describe := c.PostForm("describe")
// service := c.PostForm("service")
// var url_prefix = os.Getenv("BASE_URL")
// linkedin := os.Getenv("LINKEDIN")
// facebook := os.Getenv("FACEBOOK")
// twitter := os.Getenv("TWITTER")
// youtube := os.Getenv("YOUTUBE")
// insta := os.Getenv("INSTAGRAM")
// data := map[string]interface{}{
// "service": service,
// "fname": companyname,
// "email": contectemail,
// "number": contectnumber,
// "timezone": timezone,
// "Country": Country,
// "describe": describe,
// "admin_logo": url_prefix + "public/img/SpurtCMSlogo.png",
// "fb_logo": url_prefix + "public/img/email-icons/facebook.png",
// "linkedin_logo": url_prefix + "public/img/email-icons/linkedin.png",
// "twitter_logo": url_prefix + "public/img/email-icons/x.png",
// "youtube_logo": url_prefix + "public/img/email-icons/youtube.png",
// "insta_log": url_prefix + "public/img/email-icons/instagram.png",
// "facebook": facebook,
// "instagram": insta,
// "youtube": youtube,
// "linkedin": linkedin,
// "twitter": twitter,
// }
// Chan := make(chan string, 1)
// var wg1 sync.WaitGroup
// wg1.Add(1)
// go SupportEmail(Chan, &wg1, data, contectemail, TenantId)
// var wg sync.WaitGroup
// wg.Add(1)
// go SupportuserEmail(Chan, &wg, data, contectemail, TenantId)
// close(Chan)
// // c.Redirect(301, "/getsupport/")
// c.Redirect(301, "/getsupport/supportsubmited")
// }
func MakeStripePayment(c *gin.Context) {
companyname := c.PostForm("companyname")
contectemail := c.PostForm("contectemail")
contectnumber := c.PostForm("contectnumber")
Country := c.PostForm("Country")
// Interval := c.PostForm("interval")
var asset_code string
var PaymentURL = os.Getenv("GETSUPPORTAPI")
var Return_URL = os.Getenv("return_url")
var product_type_key = os.Getenv("product_type_key")
var product_id = os.Getenv("product_id")
// var asset_code_monthly = os.Getenv("asset_code_monthly")
var asset_code_Yearly = os.Getenv("asset_code_Yearly")
asset_code = asset_code_Yearly
// switch Interval {
// case "year":
// asset_code = asset_code_Yearly
// case "month":
// asset_code = asset_code_monthly
// default:
// fmt.Println("Invalid interval")
// }
var business_id = os.Getenv("business_id")
// Create the form data
formData := url.Values{
"return_url": {Return_URL},
"cancel_url": {"http://dev.spurtcms.com/admin/get-spurtcmspro"},
"product_type_key": {product_type_key},
"email": {contectemail},
"product_id": {product_id},
"asset_code": {asset_code},
"country": {Country},
// "interval": {Interval},
"firstname": {companyname},
"phone": {contectnumber},
"business_id": {business_id},
}
client := &http.Client{}
req, err := http.NewRequest("POST", PaymentURL, bytes.NewBufferString(formData.Encode()))
if err != nil {
log.Fatalf("Error creating request: %v", err)
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
// Send the request
resp, err := client.Do(req)
if err != nil {
log.Fatalf("Error sending request: %v", err)
}
defer resp.Body.Close()
// Read the response
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatalf("Error reading response body: %v", err)
}
c.Data(http.StatusOK, "text/html", body)
}
+68
View File
@@ -0,0 +1,68 @@
package controllers
import (
"spurt-cms/models"
"time"
"github.com/gin-gonic/gin"
csrf "github.com/utrack/gin-csrf"
)
func Personalization(c *gin.Context) {
var id = c.GetInt("userid")
var personalize_data models.TblUserPersonalize
models.GetPersonalize(&personalize_data, id,TenantId)
var logo = personalize_data.LogoPath
menu := NewMenuController(c)
Folder, File, Media, _, _ := GetMedia()
translate, _ := TranslateHandler(c)
selectedtype, _ := GetSelectedType()
c.HTML(200, "personalize.html", gin.H{"Menu": menu,"linktitle":"Personalize", "title": "Personalize", "csrf": csrf.GetToken(c), "HeadTitle": translate.Setting.Personalize, "translate": translate, "Folder": Folder, "File": File, "Media": Media, "logo": logo, "SettingsHead": true, "Personalizemenu": true, "Tooltiptitle": translate.Setting.Personalizetooltip, "StorageType": selectedtype.SelectedType})
}
func PersonalizationUpdate(c *gin.Context) {
var (
id = c.GetInt("userid")
cl = c.PostForm("color-change")
imagePath string
expandimagePath string
personalize_data models.TblUserPersonalize
)
imagePath = c.PostForm("logo_imgpath")
expandimagePath = c.PostForm("expandlogo_imgpath")
err := models.GetPersonalize(&personalize_data, id,TenantId)
if err != nil {
personalize_data.UserId = id
personalize_data.MenuBackgroundColor = cl
personalize_data.LogoPath = imagePath
personalize_data.ExpandLogoPath = expandimagePath
personalize_data.CreatedOn, _ = time.Parse("2006-01-02 15:04:05", time.Now().UTC().Format("2006-01-02 15:04:05"))
err1 := models.CreatePersonalize(&personalize_data)
if err1 != nil {
ErrorLog.Printf("create personalize error : %s", err)
}
} else {
personalize_data.MenuBackgroundColor = cl
personalize_data.LogoPath = imagePath
personalize_data.ExpandLogoPath = expandimagePath
personalize_data.ModifiedOn, _ = time.Parse("2006-01-02 15:04:05", time.Now().UTC().Format("2006-01-02 15:04:05"))
err2 := models.UpdatePersonalize(&personalize_data, id,TenantId)
if err2 != nil {
ErrorLog.Printf("update personalize error : %s", err)
}
}
c.SetCookie("get-toast", "Personalize Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/settings/personalize/")
}
+995
View File
@@ -0,0 +1,995 @@
package controllers
import (
"encoding/json"
"fmt"
"html/template"
"net/http"
"os"
"path"
storagecontroller "spurt-cms/storage-controller"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
"github.com/spurtcms/auth"
"github.com/spurtcms/categories"
chn "github.com/spurtcms/channels"
"github.com/spurtcms/courses"
forms "github.com/spurtcms/forms-builders"
"github.com/spurtcms/listing"
menu "github.com/spurtcms/menu"
csrf "github.com/utrack/gin-csrf"
)
// ContentMenuList
func MenuList(c *gin.Context) {
var (
limt int
offset int
filter menu.Filter
FinalMenusList []menu.TblMenus
)
//get values from url query
limit := c.Query("limit")
pageno, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
filter.Keyword = strings.Trim(c.DefaultQuery("keyword", ""), " ")
filter.Status = strings.Trim(c.DefaultQuery("status", ""), " ")
filter.ToDate = strings.Trim(c.DefaultQuery("lastupdated", ""), " ")
// webid, _ := strconv.Atoi(c.Query("webid"))
var filterflag bool
if filter.Keyword != "" {
filterflag = true
} else {
filterflag = false
}
if limit == "" {
limt = Limit
} else {
limt, _ = strconv.Atoi(limit)
}
if pageno != 0 {
offset = (pageno - 1) * limt
}
permission, perr := NewAuth.IsGranted("Menu", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("menu authorization error:%s", perr)
c.AbortWithStatus(http.StatusInternalServerError)
return
}
if !permission {
ErrorLog.Printf("menu authorization error")
c.Redirect(http.StatusMovedPermanently, "/403-page")
return
}
MenuConfig.DataAccess = c.GetInt("dataaccess")
MenuConfig.UserId = c.GetInt("userid")
Menulist, Total_count, err := MenuConfig.MenuList(limt, offset, menu.Filter(filter), TenantId, 0)
if err != nil {
ErrorLog.Printf("menu list error: %s", err)
}
for _, val := range Menulist {
if !val.ModifiedOn.IsZero() {
val.DateString = val.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
val.DateString = val.CreatedOn.In(TZONE).Format(Datelayout)
}
menuitemslist, _ := MenuConfig.GetMenusByParentid(val.Id, TenantId)
val.MenuitemCount = len(menuitemslist) - 1
fmt.Println("lengdffd", len(menuitemslist))
FinalMenusList = append(FinalMenusList, val)
}
//pagination calc
paginationendcount := len(Menulist) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(pageno, int(Total_count), limt)
webbanner, _ := c.Cookie("webbanner")
if webbanner == "" {
webbanner = "true"
}
ModuleName, TabName, _ := ModuleRouteName(c)
translate, _ := TranslateHandler(c)
var pages bool
// if webid != 0 {
// pages = true
// }
Websitedet, _ := MenuConfig.GetWebsiteById(0, TenantId)
templatedetail, err := MenuConfig.GetTemplateById(Websitedet.TemplateId, TenantId)
if err != nil {
fmt.Println(err)
}
templatedetail.DateString = templatedetail.CreatedOn.In(TZONE).Format(Datelayout)
Websitedet.DateString = Websitedet.ModifiedOn.In(TZONE).Format(Datelayout)
url := os.Getenv("BASE_URL")
c.HTML(200, "menulist.html", gin.H{"Pagination": PaginationData{
NextPage: pageno + 1,
PreviousPage: pageno - 1,
TotalPages: PageCount,
TwoAfter: pageno + 2,
TwoBelow: pageno - 2,
ThreeAfter: pageno + 3,
}, "Searchtrue": filterflag, "webbanner": webbanner, "web": Websitedet, "gotemplatepageheader": pages, "templatedetail": templatedetail, "Count": Total_count, "Limit": limt, "csrf": csrf.GetToken(c), "title": ModuleName, "Tabmenu": TabName, "translate": translate, "Menulist": FinalMenusList, "Menu": NewMenuController(c), "linktitle": "Menus", "Paginationendcount": paginationendcount, "Previous": Previous, "Next": Next, "PageCount": PageCount, "CurrentPage": pageno, "Page": Page, "Filter": filter, "Paginationstartcount": paginationstartcount, "HeadTitle": "Menu", "Url": url})
}
// Content MenuItemsList
func MenuIemsList(c *gin.Context) {
permission, perr := NewAuth.IsGranted("Menu", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("menu authorization error:%s", perr)
c.AbortWithStatus(http.StatusInternalServerError)
return
}
if !permission {
ErrorLog.Printf("menu authorization error")
c.Redirect(http.StatusMovedPermanently, "/403-page")
return
}
var recentChannels []chn.Tblchannel
var recentCourses []courses.TblCourses
var recentForms []forms.TblForms
var recentCategories []categories.Arrangecategories
var recentPages []menu.TblTemplatePages
TenMinutesAgo := time.Now().Add(-60 * time.Minute)
channelist, _, clerr := ChannelConfig.ListChannel(chn.Channels{Limit: 100, Offset: 0, IsActive: true, TenantId: TenantId})
if clerr != nil {
ErrorLog.Printf("channellist error :%s", clerr)
}
courseslist, _, err := CoursesConfig.CoursesList(100, 0, courses.Filter{}, TenantId)
if err != nil {
ErrorLog.Printf("courselist error :%s", err)
}
Formlist, _, _, err := FormConfig.FormBuildersList(100, 0, forms.Filter{}, TenantId, 1, 0, "", 0)
if err != nil {
ErrorLog.Printf("formslist error :%s", err)
}
for _, val := range channelist {
if val.CreatedOn.After(TenMinutesAgo) {
recentChannels = append(recentChannels, val)
}
}
for _, val := range courseslist {
if val.CreatedOn.After(TenMinutesAgo) {
recentCourses = append(recentCourses, val)
}
}
for _, val := range Formlist {
if val.CreatedOn.After(TenMinutesAgo) {
recentForms = append(recentForms, val)
}
}
menuid, _ := strconv.Atoi(c.Param("id"))
menuitemslist, err := MenuConfig.GetMenusByParentid(menuid, TenantId)
var newmenuitemlist []menu.TblMenus
for _, item := range menuitemslist {
item.HtmlDescription = template.HTML(item.Description)
newmenuitemlist = append(newmenuitemlist, item)
}
menudetails, _ := MenuConfig.GetmenyById(menuid, TenantId)
Categorylist, _ := CategoryConfig.AllCategoriesWithSubList(TenantId)
for _, val := range Categorylist {
for _, val1 := range val.Categories {
if val1.CreatedOn.After(TenMinutesAgo) {
recentCategories = append(recentCategories, val)
}
}
}
var selectedcategoryids []int
var selectedlistingids []int
for _, val := range Categorylist {
for _, val1 := range val.Categories {
for _, val2 := range menuitemslist {
if val2.Type == "categories" && val2.TypeId == val1.Id {
selectedcategoryids = append(selectedcategoryids, val1.Id)
}
if val2.Type == "listings" && val2.TypeId == val1.Id {
selectedlistingids = append(selectedlistingids, val1.Id)
}
}
}
}
ModuleName, TabName, _ := ModuleRouteName(c)
translate, _ := TranslateHandler(c)
webid, _ := strconv.Atoi(c.Query("webid"))
var pages bool
if webid != 0 {
pages = true
}
Websitedet, _ := MenuConfig.GetWebsiteById(0, TenantId)
templatedetail, err := MenuConfig.GetTemplateById(Websitedet.TemplateId, TenantId)
if err != nil {
fmt.Println(err)
}
Entrylist, _, _, _ := ChannelConfig.ChannelEntriesList(chn.Entries{}, TenantId)
pagelist, _, err := MenuConfig.GetTemplatePageList(100, 0, menu.Filter{Status: "Active"}, TenantId, 0)
for _, val := range pagelist {
if val.CreatedOn.After(TenMinutesAgo) {
recentPages = append(recentPages, val)
}
}
listinglist, _, err := ListingConfig.ListingsList(100, 0, listing.Filter{}, TenantId)
if err != nil {
fmt.Printf("Unable to fetch Listings List:%v", err)
}
c.HTML(200, "menuitems.html", gin.H{"csrf": csrf.GetToken(c), "recentPages": recentPages, "recentCategories": recentCategories, "selectedcategoryids": selectedcategoryids, "selectedlistingids": selectedlistingids, "websitedetail": Websitedet, "Entrylist": Entrylist, "pagelist": pagelist, "listinglist": listinglist, "gotemplatepageheader": pages, "templatedetail": templatedetail, "recentChannels": recentChannels, "recentCourses": recentCourses, "recentForms": recentForms, "menudetails": menudetails, "menuitemslist": newmenuitemlist, "title": ModuleName, "Tabmenu": TabName, "translate": translate, "Menu": NewMenuController(c), "linktitle": "Menus Items", "channelist": channelist, "courselist": courseslist, "Formlist": Formlist, "menuid": menuid, "Categorylist": Categorylist})
}
// CreateMenu
func CreateMenu(c *gin.Context) {
menuname := c.PostForm("menu_name")
menutitle := c.PostForm("menu_title")
menudesc := c.PostForm("menu_desc")
userid := c.GetInt("userid")
websiteid := c.Query("webid")
webid, _ := strconv.Atoi(c.Query("webid"))
menustatus, _ := strconv.Atoi(c.PostForm("menustatus"))
menugroup := c.PostForm("menu_group")
menuOrder, _ := strconv.Atoi(c.PostForm("menu_order"))
permission, perr := NewAuth.IsGranted("Menu", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("menu authorization error:%s", perr)
c.AbortWithStatus(http.StatusInternalServerError)
return
}
if !permission {
ErrorLog.Printf("menu authorization error")
c.Redirect(http.StatusMovedPermanently, "/403-page")
return
}
_, err := MenuConfig.CreateMenus(menu.MenuCreate{MenuName: menuname, MenuTitle: menutitle, WebsiteId: webid, Description: menudesc, Status: menustatus, MenuGroup: menugroup, OrderIndex: menuOrder, TenantId: TenantId, CreatedBy: userid, ParentId: 0})
if strings.Contains(fmt.Sprint(err), "given some values is empty") {
ErrorLog.Printf("Menu mandatory field error: %s", err)
c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
c.Redirect(301, "/admin/website/menu?webid="+websiteid)
return
}
if err != nil {
ErrorLog.Printf("Menu error: %s", perr)
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.Redirect(http.StatusMovedPermanently, "/admin/website/menu")
return
}
c.SetCookie("get-toast", "Menu Created Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(http.StatusMovedPermanently, "/admin/website/menu")
}
func UpdateMenu(c *gin.Context) {
web := os.Getenv("WEBSITE_DATA_ID")
userid := c.GetInt("userid")
menuid, _ := strconv.Atoi(c.PostForm("menu_id"))
menustatus, _ := strconv.Atoi(c.PostForm("menustatus"))
pageno := c.Request.PostFormValue("menupageno")
menupage := c.PostForm("menupage")
websiteId, _ := strconv.Atoi(web)
// webid, _ := strconv.Atoi(c.Query("webid"))
menugroup := c.PostForm("menu_group")
menuOrder, _ := strconv.Atoi(c.PostForm("menu_order"))
menudetails := menu.MenuCreate{
MenuName: c.PostForm("menu_name"),
MenuTitle: c.PostForm("menu_title"),
Description: c.PostForm("menu_desc"),
Status: menustatus,
ModifiedBy: userid,
TenantId: TenantId,
Id: menuid,
WebsiteId: websiteId,
MenuGroup: menugroup,
OrderIndex: menuOrder,
}
var url string
if menupage == "menuitems" {
url = "/admin/website/menu/menuitems/" + c.PostForm("menu_id")
} else {
if pageno != "" {
url = "/admin/website/menu?page=" + pageno
} else {
url = "/admin/website/menu"
}
}
// if web != "" && web != "0" {
// if strings.Contains(url, "?") {
// url += "&webid=" + web
// } else {
// url += "?webid=" + web
// }
// }
permisison, perr := NewAuth.IsGranted("Menu", auth.Create, TenantId)
if perr != nil {
ErrorLog.Printf("Update Menu authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("Update Menu authorization error")
c.Redirect(301, "/403-page")
return
}
_, err := MenuConfig.UpdateMenu(menudetails)
if strings.Contains(fmt.Sprint(err), "given some values is empty") {
ErrorLog.Printf("UpdateMenu mandatory field error: %s", err)
c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
c.Redirect(301, url)
return
}
if err != nil {
ErrorLog.Printf("UpdateMenu error: %s", perr)
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.Redirect(http.StatusMovedPermanently, url)
return
}
c.SetCookie("get-toast", "Menu Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(http.StatusMovedPermanently, url)
}
//Delete Menu function//
func DeleteMenu(c *gin.Context) {
menuId, _ := strconv.Atoi(c.Param("id"))
fmt.Println(menuId, "menuiddd")
pageno := c.Query("page")
userid := c.GetInt("userid")
webid := c.Query("webid")
var url string
if pageno != "" {
url = "/admin/website/menu?page=" + pageno
} else {
url = "/admin/website/menu"
}
if webid != "" && webid != "0" {
if strings.Contains(url, "?") {
url += "&webid=" + webid
} else {
url += "?webid=" + webid
}
}
permisison, perr := NewAuth.IsGranted("Menu", auth.Delete, TenantId)
if perr != nil {
ErrorLog.Printf("delete menu authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("Menu authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
err := MenuConfig.DeleteMenu(menuId, userid, TenantId)
if strings.Contains(fmt.Sprint(err), "given some values is empty") {
ErrorLog.Printf("deletemenu mandatory field error: %s", perr)
c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
c.Redirect(301, url)
return
}
if err != nil {
ErrorLog.Printf("deletemenu error: %s", perr)
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.Redirect(301, url)
return
}
c.SetCookie("get-toast", "Menu Deleted Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, url)
}
}
//Duplicate Menu Name check function//
func CheckMenuName(c *gin.Context) {
// get value from html form data
menu_id, _ := strconv.Atoi(c.PostForm("menu_id"))
menu_name := c.PostForm("menu_name")
websiteid, _ := strconv.Atoi(c.PostForm("webid"))
parentmenu_id, _ := strconv.Atoi(c.PostForm("parentmenu_id"))
permisison, perr := NewAuth.IsGranted("Menu", auth.Read, TenantId)
if perr != nil {
ErrorLog.Printf("checkmenugroupname authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("menugroup authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
flg, err := MenuConfig.CheckMenuName(menu_id, menu_name, parentmenu_id, websiteid, TenantId)
if err != nil {
ErrorLog.Printf("checkmenugroupname error: %s", err)
json.NewEncoder(c.Writer).Encode(false)
return
}
json.NewEncoder(c.Writer).Encode(flg)
}
}
//Status change function//
func MenuStatusChange(c *gin.Context) {
menuId, _ := strconv.Atoi(c.PostForm("id"))
userid := c.GetInt("userid")
val, _ := strconv.Atoi(c.Request.PostFormValue("isactive"))
permisison, perr := NewAuth.IsGranted("Menu", auth.Update, TenantId)
if perr != nil {
ErrorLog.Printf("delete menu authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("Menu authorization error")
c.Redirect(301, "/403-page")
return
}
if permisison {
flg, err := MenuConfig.MenuStatusChange(menuId, val, userid, TenantId)
if err != nil {
ErrorLog.Printf("menu status change error: %s", err)
json.NewEncoder(c.Writer).Encode(flg)
} else {
json.NewEncoder(c.Writer).Encode(flg)
}
}
}
func MenuPublish(c *gin.Context) {
permisison, perr := NewAuth.IsGranted("Menu", auth.Update, TenantId)
if perr != nil {
ErrorLog.Printf("delete menu authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("Menu authorization error")
c.Redirect(301, "/403-page")
return
}
menuid, _ := strconv.Atoi(c.Param("id"))
userid := c.GetInt("userid")
// webid := c.Query("webid")
_, err := MenuConfig.MenuStatusChange(menuid, 1, userid, TenantId)
if err != nil {
fmt.Println(err)
}
c.SetCookie("get-toast", "Menu Updated Successfully", 3600, "", "", false, false)
c.Redirect(301, "/admin/website/menu/menuitems/"+c.Param("id"))
}
//Menu Item Creation//
func CreateMenuItem(c *gin.Context) {
labelname := c.PostForm("menu_name")
urlpath := c.PostForm("urlpath")
seperatewindow := c.PostForm("separatewindow")
parentmenuid, _ := strconv.Atoi(c.PostForm("menu_id"))
menuGroupType := c.PostForm("parentmenu_grouptype")
mode := c.PostForm("formmode")
mtype := c.PostForm("type")
typeid, _ := strconv.Atoi(c.PostForm("menu_typeid"))
listingsids := c.PostForm("listingsids")
categoryids := c.PostForm("categoryids")
userid := c.GetInt("userid")
websiteid := c.Query("webid")
webid, _ := strconv.Atoi(websiteid)
imagedata := c.PostForm("svgHidden")
metatitle := c.PostForm("meta_title")
metadesc := c.PostForm("meta_description")
metakeywords := c.PostForm("meta_keywords")
slugname := c.PostForm("slug_name")
userDetails, err := GetRequestScopedTenantDetails(c)
if err != nil {
fmt.Println(err, "usdererr")
}
var imageName, imagePath, newimagepath string
//svgimage upload in s3//
if imagedata != "" {
var (
imageByte []byte
err error
)
imageName, imagePath, imageByte, err = ConvertBase64toByte(imagedata, "website")
if err != nil {
ErrorLog.Printf("convert base 64 to byte error : %s", err)
}
imagePath = path.Join(userDetails.S3FolderName, imagePath)
newimagepath = strings.Replace(imagePath, "+", "%2B", -1)
uerr := storagecontroller.UploadCropImageS3(imageName, imagePath, imageByte)
if uerr != nil {
c.SetCookie("Alert-msg", "ERRORAWScredentialsnotfound", 3600, "", "", false, false)
c.Redirect(301, "/admin/website/menu/menuitems/"+c.PostForm("menu_id"))
return
}
}
//end
if urlpath == "" && mtype == "channel" {
urlpath = "/" + strings.ToLower(strings.ReplaceAll(slugname, " ", "-"))
} else if mtype == "listings" {
urlpath = "/listing/category/" + strings.ToLower(strings.ReplaceAll(labelname, " ", "-"))
mtype = "listings"
} else if urlpath == "/entries/" {
urlpath = "/entries/" + strings.ToLower(strings.ReplaceAll(labelname, " ", "-"))
mtype = "entries"
}
if mtype == "categories" {
channelinfo, _ := ChannelConfig.GetChannelByCategoryId(typeid)
urlpath = "/" + channelinfo.SlugName + "/category/" + strings.ToLower(strings.ReplaceAll(labelname, " ", "-"))
mtype = "categories"
}
var mainpareninfo menu.TblTemplatePages
if mtype == "pages" {
pageinfo, err := MenuConfig.GetPageById(typeid, TenantId)
if err != nil {
fmt.Println(err)
}
if pageinfo.ParentId != 0 {
parentinfo, _ := MenuConfig.GetPageById(pageinfo.ParentId, TenantId)
if parentinfo.ParentId != 0 {
mainpareninfo, _ = MenuConfig.GetPageById(parentinfo.ParentId, TenantId)
urlpath = "/" + mainpareninfo.Slug + "/" + parentinfo.Slug + "/" + strings.ToLower(strings.ReplaceAll(slugname, " ", "-"))
} else {
urlpath = "/" + parentinfo.Slug + "/" + strings.ToLower(strings.ReplaceAll(slugname, " ", "-"))
}
} else {
urlpath = "/" + strings.ToLower(strings.ReplaceAll(slugname, " ", "-"))
}
mtype = "pages"
}
var Checkbox int
if seperatewindow == "on" {
Checkbox = 1
} else {
Checkbox = 0
}
menuitemslist, err := MenuConfig.GetDirectSubMenusByParentID(parentmenuid, TenantId)
for _, value := range menuitemslist {
value.OrderIndex = value.OrderIndex + 1
_, err := MenuConfig.UpdateMenuOrderIndexes(value.OrderIndex, value.Id, parentmenuid, userid, TenantId)
fmt.Println("err", err)
}
menu, err := MenuConfig.CreateMenus(menu.MenuCreate{MenuName: labelname, Status: 1, ParentId: parentmenuid, WebsiteId: webid,
UrlPath: urlpath, TenantId: TenantId, CreatedBy: userid, Type: mtype, TypeId: typeid, ListingsIds: listingsids,
CategoryIds: categoryids, ImagePath: newimagepath, ImageName: imageName, MetaTitle: metatitle,
MetaDescription: metadesc,
MetaKeywords: metakeywords, SeperateWindow: Checkbox, OrderIndex: 1, MenuGroup: menuGroupType})
if strings.Contains(fmt.Sprint(err), "given some values is empty") {
ErrorLog.Printf("Menu mandatory field error: %s", err)
if mode == "1" {
c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
c.Redirect(301, "/admin/website/menu/menuitems/"+c.PostForm("menu_id"))
return
}
c.JSON(200, false)
}
if err != nil {
ErrorLog.Printf("Menu error: %s", err)
if mode == "1" {
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.Redirect(http.StatusMovedPermanently, "/admin/website/menu/menuitems/"+c.PostForm("redirectid"))
return
}
c.JSON(200, false)
}
if mode == "1" {
c.SetCookie("get-toast", "Menu Created Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(http.StatusMovedPermanently, "/admin/website/menu/menuitems/"+c.PostForm("redirectid"))
} else {
c.JSON(200, menu)
}
}
func UpdateMenuItem(c *gin.Context) {
labelname := c.PostForm("menu_name")
urlpath := c.PostForm("urlpath")
menugroup := c.PostForm("menu_group")
seperatewindow := c.PostForm("separatewindow")
fmt.Println(seperatewindow, "seperatewindowskbs")
if strings.Contains(urlpath, "/listings/") {
urlpath = "/listings/" + strings.ToLower(strings.ReplaceAll(labelname, " ", "-"))
}
if strings.Contains(urlpath, "/categories/") {
urlpath = "/categories/" + strings.ToLower(strings.ReplaceAll(labelname, " ", "-"))
}
// if strings.Contains(urlpath, "/channel/") {
// urlpath = "/channel/" + strings.ToLower(strings.ReplaceAll(labelname, " ", "-"))
// }
parentmenuid, _ := strconv.Atoi(c.PostForm("parentmenu_id"))
redirectid, _ := strconv.Atoi(c.PostForm("redirectid"))
menuid, _ := strconv.Atoi(c.PostForm("menuitem_id"))
mtype := c.PostForm("type")
typeid, _ := strconv.Atoi(c.PostForm("menu_typeid"))
userid := c.GetInt("userid")
webid, _ := strconv.Atoi(c.PostForm("webid"))
imagedata := c.PostForm("svgHidden")
imagedelete := c.PostForm("svgDelete")
listingsids := c.PostForm("listingsids")
categoryids := c.PostForm("categoryids")
metatitle := c.PostForm("meta_title")
metadesc := c.PostForm("meta_description")
metakeywords := c.PostForm("meta_keywords")
editorContent := c.PostForm("editorContent")
var Checkbox int
seperatewindow1, _ := strconv.Atoi(seperatewindow)
if seperatewindow1 == 1 {
Checkbox = 1
} else {
Checkbox = 0
}
var imageName, newimagepath string
var menuinfo menu.TblMenus
menuinfo, _ = MenuConfig.GetmenyById(menuid, TenantId)
if imagedelete == "1" {
imageName = ""
newimagepath = ""
} else if imagedata != "" {
var err error
imageName, newimagepath, err = ConvertBase64(imagedata, strings.TrimPrefix("storage/website", "/"))
fmt.Println("imageName", imageName, "newimagepath", newimagepath)
if err != nil {
ErrorLog.Printf("error get storage type error: %s", err)
}
} else {
imageName = menuinfo.ImageName
newimagepath = menuinfo.ImagePath
}
metainfo := c.PostForm("metainfo")
if metainfo == "false" {
metatitle = menuinfo.MetaTitle
metadesc = menuinfo.MetaDescription
metakeywords = menuinfo.MetaKeywords
}
menudetails := menu.MenuCreate{
MenuName: labelname,
Status: 1,
ModifiedBy: userid,
TenantId: TenantId,
Id: menuid,
ParentId: parentmenuid,
UrlPath: urlpath,
Type: mtype,
TypeId: typeid,
WebsiteId: webid,
ImagePath: newimagepath,
ImageName: imageName,
ListingsIds: listingsids,
CategoryIds: categoryids,
MetaTitle: metatitle,
MetaDescription: metadesc,
MetaKeywords: metakeywords,
SeperateWindow: Checkbox,
Description: editorContent,
MenuGroup: menugroup,
}
permisison, perr := NewAuth.IsGranted("Menu", auth.Create, TenantId)
if perr != nil {
ErrorLog.Printf("Update Menu authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("Update Menu authorization error")
c.Redirect(301, "/403-page")
return
}
_, err1 := MenuConfig.UpdateMenu(menudetails)
if err1 != nil {
c.JSON(200, false)
}
c.SetCookie("get-toast", "Menu Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/admin/website/menu/menuitems/"+strconv.Itoa(redirectid)+"?webid="+c.PostForm("webid"))
// c.JSON(200, updatemenu)
}
func DeleteMenuItem(c *gin.Context) {
menuId, _ := strconv.Atoi(c.Param("id"))
fmt.Println(menuId, "menuiddd")
userid := c.GetInt("userid")
menudeta, _ := MenuConfig.GetmenyById(menuId, TenantId)
permisison, perr := NewAuth.IsGranted("Menu", auth.Delete, TenantId)
if perr != nil {
ErrorLog.Printf("delete menu authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("Menu authorization error")
c.Redirect(301, "/403-page")
return
}
// FIX: Get the current view's menu ID from URL query parameter
// This ensures we redirect back to the same page the user was on
redirectId := c.Query("redirectid")
if redirectId == "" {
// Fallback: use the item's immediate parent
if menudeta.ParentId != 0 {
redirectId = strconv.Itoa(menudeta.ParentId)
} else {
redirectId = strconv.Itoa(menudeta.Id)
}
}
if permisison {
err := MenuConfig.DeleteMenu(menuId, userid, TenantId)
if strings.Contains(fmt.Sprint(err), "given some values is empty") {
ErrorLog.Printf("deletemenu mandatory field error: %s", perr)
c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
c.Redirect(301, "/admin/website/menu/menuitems/"+redirectId)
return
}
if err != nil {
ErrorLog.Printf("deletemenu error: %s", perr)
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.Redirect(301, "/admin/website/menu/menuitems/"+redirectId)
return
}
c.SetCookie("get-toast", "Menu Deleted Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/admin/website/menu/menuitems/"+redirectId)
}
}
func EditMenuItem(c *gin.Context) {
menuid, _ := strconv.Atoi(c.Param("id"))
menuinfo, _ := MenuConfig.GetmenyById(menuid, TenantId)
c.JSON(200, menuinfo)
}
func UpdateMenuitemOrder(c *gin.Context) {
var orderData []menu.OrderItem
err := json.Unmarshal([]byte(c.Request.PostFormValue("orderData")), &orderData)
if err != nil {
fmt.Println(err)
}
userid := c.GetInt("userid")
merr := MenuConfig.UpdateMenuItemOrder(orderData, userid, TenantId)
if merr != nil {
fmt.Println(merr)
}
c.JSON(200, true)
}
// Content MenuItemsList
func MenuIemsListForWebsite(c *gin.Context) {
menuid, _ := strconv.Atoi(c.Param("id"))
newmenuitemlist, _ := MenuConfig.GetMenusByParentId(menuid)
for i := range newmenuitemlist {
newmenuitemlist[i].Description = StripHTML(newmenuitemlist[i].Description)
}
menudetails, _ := MenuConfig.GetmenyByIdForWebsite(menuid)
ModuleName, TabName, _ := ModuleRouteName(c)
responseData := gin.H{
"menudetails": menudetails, "menuitemslist": newmenuitemlist, "title": ModuleName, "Tabmenu": TabName, "Menu": NewMenuController(c), "linktitle": "Menus Items", "menuid": menuid,
}
fmt.Println("responseData")
c.JSON(200, gin.H{
"status": true,
"data": responseData,
})
}
+172
View File
@@ -0,0 +1,172 @@
package controllers
import (
"fmt"
"spurt-cms/models"
"strconv"
"strings"
"github.com/gin-gonic/gin"
"github.com/spurtcms/channels"
csrf "github.com/utrack/gin-csrf"
)
func ListTemplates(c *gin.Context) {
var limit, offset int
keyword := strings.TrimSpace(c.Request.URL.Query().Get("keyword"))
channelSlug := c.Request.URL.Query().Get("channel")
userLimit := c.Query("limit")
pageno, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
if userLimit == "" {
limit = Limit
} else {
limit, _ = strconv.Atoi(userLimit)
}
if pageno != 0 {
offset = (pageno - 1) * limit
}
var (
templateList []models.TblTemplates
templateModuleList []models.TblTemplateModules
mainCount int64
tempCountList []int
err error
channelDetails models.TblChannel
)
tempBannerValue, _ := c.Cookie("channelbanner")
if tempBannerValue == "" {
tempBannerValue = "true"
}
templateModuleList, mainCount, err = models.GetTemplateModuleList(keyword, TenantId, channelSlug)
if err != nil {
ErrorLog.Printf("%v: %v", ErrGettingTemplateModuleList, err)
}
channelDetails, err = models.GetChannelDetailsWithTemplateCount(channelSlug, TenantId)
if err != nil {
ErrorLog.Printf("%v: %v", ErrGettingTemplateModuleList, err)
}
var imagePath string
var finalList []models.TblTemplateModules
for _, templateModule := range templateModuleList {
tempCountList = append(tempCountList, len(templateModule.Templates))
moduleName := strings.ToTitle(templateModule.TemplateModuleName)
moduleSlug := strings.ToTitle(templateModule.TemplateModuleSlug)
templateModule.TemplateModuleName = moduleName
templateModule.TemplateModuleSlug = moduleSlug
var finalTemplateList []models.TblTemplates
var count = 0
for _, template := range templateModule.Templates {
// changedTempName := strings.ToTitle(template.TemplateName)
var changedTempName string
if len(moduleName) > 0 {
changedTempName = strings.ToUpper(string(template.TemplateName[0])) + template.TemplateName[1:]
}
changedTempSlug := strings.ToTitle(template.TemplateSlug)
if template.ImagePath != "" {
imagePath = "/image-resize?name=" + template.ImagePath
} else {
imagePath = ""
}
count++
template.ImagePath = imagePath
template.TemplateName = changedTempName
template.TemplateSlug = changedTempSlug
if strings.Contains(template.DeployLink, "next_public_spurtcms_nextjs_starter_apikey") {
template.DeployLink = strings.Replace(template.DeployLink, "next_public_spurtcms_nextjs_starter_apikey", "NEXT_PUBLIC_SPURTCMS_NEXTJS_STARTER_APIKEY", -1)
}
finalTemplateList = append(finalTemplateList, template)
}
templateModule.Templates = finalTemplateList
templateModule.TemplateCount = count
finalList = append(finalList, templateModule)
}
channelList, _, err := ChannelConfig.ListChannel(channels.Channels{Limit: 200, Offset: 0, IsActive: true, TenantId: TenantId})
if err != nil {
ErrorLog.Printf("%v: %v", ErrGettingTemplateModuleList, err)
}
var finalChannelList []channels.Tblchannel
for _, chnList := range channelList {
templateCount, err := models.GetChannelBasedTemplateCount(chnList.SlugName, TenantId)
if err != nil {
ErrorLog.Printf("%v: %v", ErrGettingTemplateModuleList, err)
}
chnList.EntriesCount = templateCount.TemplateCount
finalChannelList = append(finalChannelList, chnList)
}
var allZeros bool
if len(tempCountList) > 0 {
for _, val := range tempCountList {
if val != 0 {
allZeros = false
break
}
allZeros = true
}
} else {
allZeros = true
}
var paginationendcount = len(templateList) + offset
var paginationstartcount = offset + 1
previous, next, pageCount, page := Pagination(pageno, int(mainCount), limit)
menu := NewMenuController(c)
translate, _ := TranslateHandler(c)
goTemplateList, err := ReadYamlFile("websites/themes")
if err != nil {
fmt.Println("Failed to read YAML files:", err)
}
c.HTML(200, "template.html", gin.H{"csrf": csrf.GetToken(c), "tempBannerValue": tempBannerValue, "linktitle": "Templates", "Menu": menu, "translate": translate, "SettingsHead": true, "title": "Next.js Templates", "TemplateModules": finalList, "Count": mainCount, "IsCountZero": allZeros, "Filter": keyword, "Previous": previous, "Next": next, "PageCount": pageCount, "CurrentPage": pageno, "Page": page, "Limit": limit, "Paginationendcount": paginationendcount, "ChannelList": finalChannelList, "ChannelDetail": channelDetails, "templatelist": goTemplateList, "Paginationstartcount": paginationstartcount, "Pagination": PaginationData{
NextPage: pageno + 1,
PreviousPage: pageno - 1,
TotalPages: pageCount,
TwoAfter: pageno + 2,
TwoBelow: pageno - 2,
ThreeAfter: pageno + 3,
}})
}
func Templates(c *gin.Context) {
c.HTML(200, "template.html", gin.H{"Name": "Dhanush"})
}
+823
View File
@@ -0,0 +1,823 @@
package controllers
import (
"encoding/json"
"fmt"
"os"
"spurt-cms/models"
storagecontroller "spurt-cms/storage-controller"
"net/http"
"strconv"
"strings"
"sync"
"github.com/gin-gonic/gin"
"github.com/spurtcms/auth"
"github.com/spurtcms/team"
teamroles "github.com/spurtcms/team-roles"
csrf "github.com/utrack/gin-csrf"
)
var query models.QUERY
// user list
func Userlist(c *gin.Context) {
var (
limt, offset int
filter team.Filters
)
//get values from html form data
limit := c.Query("limit")
pageno, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
if limit == "" {
limt = Limit
} else {
limt, _ = strconv.Atoi(limit)
}
if pageno != 0 {
offset = (pageno - 1) * limt
}
filter.Keyword = strings.Trim(c.DefaultQuery("keyword", ""), " ")
var filterflag bool
if filter.Keyword != "" {
filterflag = true
} else {
filterflag = false
}
permisison, perr := NewAuth.IsGranted("Team", auth.CRUD, TenantId) //check role based permissions
if perr != nil {
ErrorLog.Printf("Userlist authorization error: %s", perr)
}
if !permisison {
c.Redirect(301, "/403-page")
return
}
NewTeam.Dataaccess = c.GetInt("dataaccess")
NewTeam.Userid = c.GetInt("userid")
userlist, count, err := NewTeam.ListUser(limt, offset, team.Filters{Keyword: filter.Keyword}, TenantId)
if err != nil {
ErrorLog.Printf("Getting userlist data error : %s", err)
}
var userlists []team.TblUser
for _, val := range userlist {
if !val.ModifiedOn.IsZero() { //change date format to display on list
val.ModuleName = val.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
val.ModuleName = val.CreatedOn.In(TZONE).Format(Datelayout)
}
if val.ProfileImagePath != "" {
if val.StorageType == "local" {
val.ProfileImagePath = "/" + val.ProfileImagePath
} else if val.StorageType == "aws" {
val.ProfileImagePath = "/image-resize?name=" + val.ProfileImagePath
}
}
userlists = append(userlists, val)
}
var paginationendcount = len(userlist) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(pageno, int(count), limt)
menu := NewMenuController(c)
translate, _ := TranslateHandler(c)
roles, _, rerr := NewRole.RoleList(teamroles.Rolelist{GetAllData: true}, TenantId, true)
if rerr != nil {
ErrorLog.Printf("Getting all rolelist data error : %s", rerr)
}
loguserid, _ := c.Get("userid")
storagetype, err := GetSelectedType()
if err != nil {
fmt.Printf("member list getting storagetype error: %s", err)
}
roleidlog := c.GetInt("role")
c.HTML(200, "teams.html", gin.H{"csrf": csrf.GetToken(c), "Pagination": PaginationData{
NextPage: pageno + 1,
PreviousPage: pageno - 1,
TotalPages: PageCount,
TwoAfter: pageno + 2,
TwoBelow: pageno - 2,
ThreeAfter: pageno + 3,
}, "HeadTitle": translate.Setting.Teams, "linktitle": "Teams", "Searchtrue": filterflag, "Roles": roles, "user": userlists, "Count": count, "Previous": Previous, "Next": Next, "PageCount": PageCount, "CurrentPage": pageno, "Page": Page, "Limit": limt, "Paginationendcount": paginationendcount, "Paginationstartcount": paginationstartcount, "Menu": menu, "Filter": filter, "translate": translate, "chcount": count, "SettingsHead": true, "Teamsmenu": true, "Tooltiptitle": translate.Setting.Teamstooltip, "title": "Teams", "loggedinuser": loguserid, "StorageType": storagetype.SelectedType, "roleidlog": roleidlog})
}
// create user
func CreateUser(c *gin.Context) {
//check validation
if c.PostForm("user_fname") == "" || c.PostForm("user_email") == "" || c.PostForm("user_mob") == "" || c.PostForm("user_name") == "" || c.PostForm("user_pass") == "" || c.PostForm("user_role") == "" {
ErrorLog.Printf("create user error mandatory field error")
c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/users/")
return
}
//get values from html form data
Roleid, _ := strconv.Atoi(c.PostForm("user_role"))
IsActive, _ := strconv.Atoi(c.PostForm("mem_activestat"))
DataAccess, _ := strconv.Atoi(c.PostForm("mem_data_access"))
imagedata := c.PostForm("crop_data")
// tenantDetails, err := NewTeam.GetTenantDetails(TenantId)
// if err != nil {
// ErrorLog.Printf("unable to get the tenant details: %s", err)
// }
// if (tenantDetails.Id == 1) && (tenantDetails.S3FolderName == "") {
// var s3FolderName = "SuperAdminFolder"
// s3Path, err := storagecontroller.CreateFolderToS3(s3FolderName, "")
// if err != nil {
// fmt.Println("error creating a folder for super user in s3 bucket:", err)
// ErrorLog.Printf("error creating a folder for super user in s3 bucket: %v", err)
// return
// }
// err = NewTeam.UpdateS3FolderName(0, tenantDetails.Id, s3Path)
// if err != nil {
// fmt.Println("error updating folder path for super admin in Database:", err)
// ErrorLog.Printf("error updating folder path for super admin in Database: %v", err)
// return
// }
// tenantDetails.S3FolderName = s3Path
// }
userDetails, err := GetRequestScopedTenantDetails(c)
if err != nil {
ErrorLog.Printf("%s", err)
return
}
var imageName, imagePath string
storagetype, err := GetSelectedType()
if err != nil {
ErrorLog.Printf("error get storage type error: %s", err)
}
if storagetype.SelectedType == "local" {
if imagedata != "" {
imageName, imagePath, _ = ConvertBase64(imagedata, "storage/user")
}
} else if storagetype.SelectedType == "aws" {
if imagedata != "" {
var (
imageByte []byte
err error
)
imageName, imagePath, imageByte, err = ConvertBase64toByte(imagedata, "user")
if err != nil {
ErrorLog.Printf("convert base 64 to byte error : %s", err)
}
imagePath = userDetails.S3FolderName + imagePath
uerr := storagecontroller.UploadCropImageS3(imageName, imagePath, imageByte)
if uerr != nil {
c.SetCookie("Alert-msg", "ERRORAWScredentialsnotfound", 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/users/")
return
}
}
}
//pass values to the team struct
Newuser := team.TeamCreate{
FirstName: c.PostForm("user_fname"),
LastName: c.PostForm("user_lname"),
Email: c.PostForm("user_email"),
MobileNo: c.PostForm("user_mob"),
Username: c.PostForm("user_name"),
Password: c.PostForm("user_pass"),
ProfileImage: imageName,
ProfileImagePath: imagePath,
RoleId: Roleid,
IsActive: IsActive,
DataAccess: DataAccess,
CreatedBy: userDetails.Id,
StorageType: storagetype.SelectedType,
TenantId: TenantId,
S3FolderPath: userDetails.S3FolderName,
DefaultLanguageId: userDetails.DefaultLanguageId,
}
permisison, perr := NewAuth.IsGranted("Team", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("CreateUser authorization error: %s", perr)
}
if !permisison {
c.Redirect(301, "/403-page")
return
}
_, _, terr := NewTeam.CreateUser(Newuser)
if strings.Contains(fmt.Sprint(terr), "given some values is empty") {
c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/users/")
return
}
if err != nil {
ErrorLog.Printf("Creating User error: %s", err)
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.SetCookie("Alert-msg", "alert", 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/users/")
return
}
// var email models.TblEmailTemplate
// err = models.GetTemplates(&email, "createuser", TenantId)
// if err != nil {
// ErrorLog.Printf("emailtemplate get error: %s", err)
// }
if IsActive == 1 {
fname := c.PostForm("user_fname")
uname := c.PostForm("user_name")
pas := c.PostForm("user_pass")
email := c.PostForm("user_email")
var url_prefix = os.Getenv("BASE_URL")
linkedin := os.Getenv("LINKEDIN")
facebook := os.Getenv("FACEBOOK")
twitter := os.Getenv("TWITTER")
youtube := os.Getenv("YOUTUBE")
insta := os.Getenv("INSTAGRAM")
data := map[string]interface{}{
"fname": fname,
"uname": uname,
"Pass": pas,
"login_url": url_prefix,
"admin_logo": url_prefix + "public/img/SpurtCMSlogo.png",
"fb_logo": url_prefix + "public/img/email-icons/facebook.png",
"linkedin_logo": url_prefix + "public/img/email-icons/linkedin.png",
"twitter_logo": url_prefix + "public/img/email-icons/x.png",
"youtube_logo": url_prefix + "public/img/email-icons/youtube.png",
"insta_log": url_prefix + "public/img/email-icons/instagram.png",
"facebook": facebook,
"instagram": insta,
"youtube": youtube,
"linkedin": linkedin,
"twitter": twitter,
}
var wg sync.WaitGroup
wg.Add(1)
go UserCreateMail(&wg, data, email, "createuser")
} else {
WarnLog.Println("Create Team email notification status not enabled")
}
c.SetCookie("get-toast", "User Created Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/users/")
}
// check email already exists
func CheckEmail(c *gin.Context) {
//get values from html form data
userid, _ := strconv.Atoi(c.PostForm("id"))
email := c.PostForm("email")
_, _, err := NewTeam.CheckEmail(email, userid, TenantId)
if err != nil {
ErrorLog.Printf("check email error: %s", err)
json.NewEncoder(c.Writer).Encode(false)
return
}
json.NewEncoder(c.Writer).Encode(true)
}
// check number already exists
func CheckNumber(c *gin.Context) {
//get values from html form data
userid, _ := strconv.Atoi(c.PostForm("id"))
number := c.PostForm("number")
_, err := NewTeam.CheckNumber(number, userid, TenantId)
if err != nil {
ErrorLog.Printf("check number error: %s", err)
json.NewEncoder(c.Writer).Encode(false)
return
}
json.NewEncoder(c.Writer).Encode(true)
}
// check username already exists
func CheckUsername(c *gin.Context) {
userid, _ := strconv.Atoi(c.PostForm("id"))
username := c.PostForm("username")
_, err := NewTeam.CheckUsername(username, userid, TenantId)
if err != nil {
ErrorLog.Printf("check Username error: %s", err)
json.NewEncoder(c.Writer).Encode(false)
return
}
json.NewEncoder(c.Writer).Encode(true)
}
// get user details
func EditUser(c *gin.Context) {
//get values from html form data
var id, _ = strconv.Atoi(c.Query("id"))
userdet, _, _ := NewTeam.GetUserById(id, []int{})
var firstn = strings.ToUpper(userdet.FirstName[:1])
var lastn string
if userdet.LastName != "" {
lastn = strings.ToUpper(userdet.LastName[:1])
}
userdet.NameString = firstn + lastn
if userdet.ProfileImagePath != "" {
if userdet.StorageType == "local" {
userdet.ProfileImagePath = "/" + userdet.ProfileImagePath
} else if userdet.StorageType == "aws" {
userdet.ProfileImagePath = "/image-resize?name=" + userdet.ProfileImagePath
}
}
c.JSON(200, userdet)
}
// Update User
func UpdateUser(c *gin.Context) {
//get values from html form data
Roleid, _ := strconv.Atoi(c.PostForm("user_role"))
IsActive, _ := strconv.Atoi(c.PostForm("mem_activestat"))
DataAccess, _ := strconv.Atoi(c.PostForm("mem_data_access"))
imagedata := c.PostForm("crop_data")
pageno := c.PostForm("pageno")
var (
url string
imageName, imagePath string
)
if pageno != "" {
url = "/admin/settings/users?page=" + pageno
} else {
url = "/admin/settings/users/"
}
//check validation
if c.PostForm("user_fname") == "" || c.PostForm("user_email") == "" || c.PostForm("user_mob") == "" || c.PostForm("user_name") == "" || c.PostForm("user_role") == "" {
c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/users/")
return
}
userid, _ := strconv.Atoi(c.PostForm("userid"))
storagetype, err := GetSelectedType()
if err != nil {
ErrorLog.Printf("error get storage type error: %s", err)
}
if storagetype.SelectedType == "local" {
if imagedata != "" {
imageName, imagePath, _ = ConvertBase64(imagedata, storagetype.Local+"/user")
}
} else if storagetype.SelectedType == "aws" {
userDetails, _, err := NewTeam.GetUserById(userid, []int{})
if err != nil {
ErrorLog.Printf("error get storage type error: %s", err)
}
if imagedata != "" {
var (
imageByte []byte
err error
)
imageName, imagePath, imageByte, err = ConvertBase64toByte(imagedata, "user")
if err != nil {
ErrorLog.Printf("convert base 64 to byte error : %s", err)
}
imagePath = userDetails.S3FolderName + imagePath
uerr := storagecontroller.UploadCropImageS3(imageName, imagePath, imageByte)
if uerr != nil {
c.SetCookie("Alert-msg", "ERRORAWScredentialsnotfound", 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/users/")
return
}
}
}
//pass values to struct
Newuser := team.TeamCreate{
FirstName: c.PostForm("user_fname"),
LastName: c.PostForm("user_lname"),
Email: c.PostForm("user_email"),
MobileNo: c.PostForm("user_mob"),
Username: c.PostForm("user_name"),
Password: c.PostForm("user_pass"),
ProfileImage: imageName,
ProfileImagePath: imagePath,
RoleId: Roleid,
IsActive: IsActive,
DataAccess: DataAccess,
StorageType: storagetype.SelectedType,
}
permisison, perr := NewAuth.IsGranted("Team", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("UpdateUser authorization error: %s", perr)
}
if !permisison {
c.Redirect(301, "/403-page")
return
}
NewTeam.Dataaccess = c.GetInt("dataaccess")
NewTeam.Userid = c.GetInt("userid")
_, terr := NewTeam.UpdateUser(Newuser, userid, TenantId)
if strings.Contains(fmt.Sprint(terr), "given some values is empty") {
c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
c.Redirect(301, url)
return
}
if err != nil {
ErrorLog.Printf("Update User error: %s", err)
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.SetCookie("Alert-msg", "alert", 3600, "", "", false, false)
c.Redirect(301, url)
return
}
c.SetCookie("get-toast", "User Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, url)
}
// DeleteUser
func DeleteUser(c *gin.Context) {
//get values from html form data
deluserId, _ := strconv.Atoi(c.Param("id"))
pageno := c.Query("page")
var url string
if pageno != "" {
url = "/admin/settings/users?page=" + pageno
} else {
url = "/admin/settings/users/"
}
userid := c.GetInt("userid")
permisison, perr := NewAuth.IsGranted("Team", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("DeleteUser authorization error: %s", perr)
}
if !permisison {
c.Redirect(301, "/403-page")
return
}
err := NewTeam.DeleteUser([]int{}, deluserId, userid, TenantId)
if err != nil {
ErrorLog.Printf("DeleteUser error: %s", perr)
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
return
}
_, count, err := NewTeam.ListUser(0, 0, team.Filters{Keyword: ""}, TenantId)
if err != nil {
ErrorLog.Printf("Getting userlist data error : %s", err)
}
recordsPerPage := Limit
totalPages := (int(count) + recordsPerPage - 1) / recordsPerPage
currentPage := 1
if pageno != "" {
currentPage, _ = strconv.Atoi(pageno)
}
if currentPage > totalPages && totalPages > 0 {
url = "/admin/settings/users?page=" + strconv.Itoa(totalPages)
}
c.SetCookie("get-toast", "User Deleted Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(http.StatusMovedPermanently, url)
}
// delete multiple user
func DeleteMultipleUser(c *gin.Context) {
var userData []map[string]string
err := json.Unmarshal([]byte(c.Request.PostFormValue("userIds")), &userData)
if err != nil {
ErrorLog.Printf("Unmarshal error in deletemultipleuser error: %s", err)
c.JSON(200, gin.H{"value": false})
return
}
pageNo := c.Request.PostFormValue("page")
var url string
if pageNo != "" {
url = "/admin/settings/users?page=" + pageNo
} else {
url = "/admin/settings/users/"
}
var userIds []int
for _, val := range userData {
userId, _ := strconv.Atoi(val["entryid"])
userIds = append(userIds, userId)
}
userid := c.GetInt("userid")
permisison, perr := NewAuth.IsGranted("Team", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("DeleteMultipleUser authorization error: %s", perr)
}
if !permisison {
c.Redirect(301, "/403-page")
return
}
err = NewTeam.DeleteUser(userIds, 0, userid, TenantId)
if err != nil {
ErrorLog.Printf("DeleteMultipleUser error: %s", err)
c.JSON(200, gin.H{"value": false})
return
}
_, count, err := NewTeam.ListUser(0, 0, team.Filters{Keyword: ""}, TenantId)
if err != nil {
ErrorLog.Printf("Getting userlist data error : %s", err)
}
recordsPerPage := Limit
totalPages := (int(count) + recordsPerPage - 1) / recordsPerPage
currentPage := 1
if pageNo != "" {
currentPage, _ = strconv.Atoi(pageNo)
}
if currentPage > totalPages && totalPages > 0 {
url = "/admin/settings/users?page=" + strconv.Itoa(totalPages)
}
c.JSON(200, gin.H{"value": true, "url": url})
}
/* Check overall validation in single function */
func CheckUserData(c *gin.Context) {
//get values from html form data
userid, _ := strconv.Atoi(c.PostForm("id"))
username := c.PostForm("username")
email := c.PostForm("email")
number := c.PostForm("mobile")
_, err1 := NewTeam.CheckUsername(username, userid, TenantId)
_, _, err2 := NewTeam.CheckEmail(email, userid, TenantId)
_, err3 := NewTeam.CheckNumber(number, userid, TenantId)
var Number, User, Email bool
if err1 != nil {
ErrorLog.Printf("DeleteMultipleUser error: %s", err1)
User = false
} else {
User = true
}
if err2 != nil {
ErrorLog.Printf("DeleteMultipleUser error: %s", err2)
Email = false
} else {
Email = true
}
if err3 != nil {
Number = false
} else {
Number = true
}
c.JSON(200, gin.H{"user": User, "number": Number, "email": Email})
}
// Multi Select Change Access
func SelectedUsersAccessChange(c *gin.Context) {
var (
entryIds []int
statusInt int
status string
entryData []map[string]string
url string
)
err := json.Unmarshal([]byte(c.Request.PostFormValue("userIds")), &entryData)
if err != nil {
c.JSON(200, gin.H{"value": false})
ErrorLog.Printf("Unmarshall error multiple access change error : %s", err)
return
}
for _, val := range entryData {
entryId, _ := strconv.Atoi(val["entryid"])
status = val["status"]
if status == "All User" {
statusInt = 1
} else if status == "User's Only" {
statusInt = 0
}
entryIds = append(entryIds, entryId)
}
pageno := c.PostForm("page")
if pageno != "" {
url = "/admin/settings/users/?page=" + pageno
} else {
url = "/admin/settings/users/"
}
userid := c.GetInt("userid")
permisison, perr := NewAuth.IsGranted("Team", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("multiple access change authorization error: %s", perr)
}
if !permisison {
c.Redirect(301, "/403-page")
return
}
err = NewTeam.ChangeAccess(entryIds, userid, statusInt, TenantId)
if err != nil {
ErrorLog.Printf("while changing the access in multiple user error: %s", err)
c.JSON(200, gin.H{"value": false})
return
}
c.JSON(200, gin.H{"value": true, "status": statusInt, "url": url})
}
func ChangeActiveStatus(c *gin.Context) {
//get values from html form data
id, _ := strconv.Atoi(c.Request.PostFormValue("id"))
activeStatus, _ := strconv.Atoi(c.Request.PostFormValue("isActive"))
userid := c.GetInt("userid")
permisison, perr := NewAuth.IsGranted("Team", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("DeleteUser authorization error: %s", perr)
}
if !permisison {
c.Redirect(301, "/403-page")
return
}
flg, err := NewTeam.ChangeActiveStatus(id, activeStatus, userid, TenantId)
if err != nil {
ErrorLog.Printf("change active status in single user error : %s ", err)
json.NewEncoder(c.Writer).Encode(flg)
}
json.NewEncoder(c.Writer).Encode(flg)
}
func SelectedUsersStatusChange(c *gin.Context) {
var (
userdIds []int
activeStatusInt int
activeStatus int
userData []map[string]string
)
if err := json.Unmarshal([]byte(c.Request.PostFormValue("userIds")), &userData); err != nil {
ErrorLog.Printf("unmarshall userid multiple status change error: %s", err)
}
for _, val := range userData {
userId, _ := strconv.Atoi(val["entryid"])
activeStatusInt, _ = strconv.Atoi(val["activeStatus"])
if activeStatusInt == 0 {
activeStatus = 1
} else if activeStatusInt == 1 {
activeStatus = 0
}
userdIds = append(userdIds, userId)
}
pageno := c.PostForm("page")
var url string
if pageno != "" {
url = "/admin/settings/users/?page=" + pageno
} else {
url = "/admin/settings/users/"
}
userid := c.GetInt("userid")
permisison, perr := NewAuth.IsGranted("Team", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("multiple statuc change authorization error: %s", perr)
}
if !permisison {
c.Redirect(301, "/403-page")
return
}
err := NewTeam.SelectedUserStatusChange(userdIds, activeStatus, userid, TenantId)
if err != nil {
ErrorLog.Printf("change active status in multiple user error : %s ", err)
c.JSON(200, gin.H{"value": false})
return
}
c.JSON(200, gin.H{"value": true, "status": activeStatus, "url": url})
}
File diff suppressed because it is too large Load Diff
+103
View File
@@ -0,0 +1,103 @@
module spurt-cms
go 1.24.2
require (
github.com/360EntSecGroup-Skylar/excelize v1.4.1
github.com/99designs/gqlgen v0.17.66
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2
github.com/aws/aws-sdk-go v1.55.5
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/gin-contrib/sessions v1.0.1
github.com/gin-gonic/gin v1.10.0
github.com/gorilla/sessions v1.2.2
github.com/joho/godotenv v1.5.1
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
github.com/sashabaranov/go-openai v1.30.3
github.com/spurtcms/auth v0.0.44
github.com/spurtcms/categories v0.0.33
github.com/spurtcms/channels v0.0.136
github.com/spurtcms/forms-builders v0.0.34
github.com/spurtcms/member v0.0.27
github.com/spurtcms/member-access v0.0.10
github.com/spurtcms/team v0.0.40
github.com/spurtcms/team-roles v0.0.23
github.com/utrack/gin-csrf v0.0.0-20190424104817-40fb8d2c8fca
github.com/vektah/gqlparser/v2 v2.5.22
golang.org/x/crypto v0.43.0
golang.org/x/net v0.46.0
golang.org/x/oauth2 v0.22.0
gorm.io/datatypes v1.2.0
gorm.io/driver/mysql v1.5.6
gorm.io/driver/postgres v1.5.9
gorm.io/gorm v1.30.0
)
require (
github.com/spurtcms/courses v0.0.31
github.com/spurtcms/listing v0.0.31
github.com/spurtcms/membership v0.0.26
github.com/spurtcms/menu v0.0.93
github.com/stripe/stripe-go/v82 v82.1.0
gopkg.in/yaml.v2 v2.4.0
)
require (
cloud.google.com/go/compute/metadata v0.3.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 // indirect
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 // indirect
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect
github.com/agnivade/levenshtein v1.2.1 // indirect
github.com/bytedance/sonic v1.11.6 // indirect
github.com/bytedance/sonic/loader v0.1.1 // indirect
github.com/cloudwego/base64x v0.1.4 // indirect
github.com/cloudwego/iasm v0.2.0 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect
github.com/dchest/uniuri v0.0.0-20160212164326-8902c56451e9 // indirect
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.20.0 // indirect
github.com/go-sql-driver/mysql v1.7.1 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/golang-jwt/jwt v3.2.2+incompatible
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
github.com/google/uuid v1.6.0
github.com/gorilla/context v1.1.2 // indirect
github.com/gorilla/securecookie v1.1.2 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 // indirect
github.com/jackc/pgx/v5 v5.5.5 // indirect
github.com/jackc/puddle/v2 v2.2.1 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.2.7 // indirect
github.com/kylelemons/godebug v1.1.0 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
github.com/rogpeppe/go-internal v1.12.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/sosodev/duration v1.3.1 // indirect
github.com/spurtcms/blocks v0.0.59
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.12 // indirect
github.com/urfave/cli/v2 v2.27.5 // indirect
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
golang.org/x/arch v0.8.0 // indirect
golang.org/x/mod v0.29.0 // indirect
golang.org/x/sync v0.18.0 // indirect
golang.org/x/sys v0.37.0 // indirect
golang.org/x/text v0.31.0 // indirect
golang.org/x/tools v0.38.0 // indirect
google.golang.org/protobuf v1.36.5 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
+296
View File
@@ -0,0 +1,296 @@
cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc=
cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
github.com/360EntSecGroup-Skylar/excelize v1.4.1 h1:l55mJb6rkkaUzOpSsgEeKYtS6/0gHwBYyfo5Jcjv/Ks=
github.com/360EntSecGroup-Skylar/excelize v1.4.1/go.mod h1:vnax29X2usfl7HHkBrX5EvSCJcmH3dT9luvxzu8iGAE=
github.com/99designs/gqlgen v0.17.66 h1:2/SRc+h3115fCOZeTtsqrB5R5gTGm+8qCAwcrZa+CXA=
github.com/99designs/gqlgen v0.17.66/go.mod h1:gucrb5jK5pgCKzAGuOMMVU9C8PnReecHEHd2UxLQwCg=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 h1:FDif4R1+UUR+00q6wquyX90K7A8dN+R5E8GEadoP7sU=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2/go.mod h1:aiYBYui4BJ/BJCAIKs92XiPyQfTaBWqvHujDwKb6CBU=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 h1:LqbJ/WzJUwBf8UiaSzgX7aMclParm9/5Vgp+TY51uBQ=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2/go.mod h1:yInRyqWXAuaPrgI7p70+lDDgh3mlBohis29jGMISnmc=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.5.0 h1:AifHbc4mg0x9zW52WOpKbsHaDKuRhlI7TVl47thgQ70=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.5.0/go.mod h1:T5RfihdXtBDxt1Ch2wobif3TvzTdumDy29kahv6AV9A=
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2 h1:YUUxeiOWgdAQE3pXt2H7QXzZs0q8UBjgRbl56qo8GYM=
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2/go.mod h1:dmXQgZuiSubAecswZE+Sm8jkvEa7kQgTPVRvwL/nd0E=
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU=
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
github.com/PuerkitoBio/goquery v1.9.3 h1:mpJr/ikUA9/GNJB/DBZcGeFDXUtosHRyRrwh7KGdTG0=
github.com/PuerkitoBio/goquery v1.9.3/go.mod h1:1ndLHPdTz+DyQPICCWYlYQMPl0oXZj0G6D4LCYA6u4U=
github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM=
github.com/agnivade/levenshtein v1.2.1/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU=
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ=
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss=
github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q=
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE=
github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=
github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff/go.mod h1:+RTT1BOk5P97fT2CiHkbFQwkK3mjsFAP6zCYV2aXtjw=
github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=
github.com/bradleypeabody/gorilla-sessions-memcache v0.0.0-20181103040241-659414f458e1/go.mod h1:dkChI7Tbtx7H1Tj7TqGSZMOeGpMP5gLHtjroHd4agiI=
github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0=
github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=
github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM=
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=
github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0=
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dchest/uniuri v0.0.0-20160212164326-8902c56451e9 h1:74lLNRzvsdIlkTgfDSMuaPjBr4cf6k7pwQQANm/yLKU=
github.com/dchest/uniuri v0.0.0-20160212164326-8902c56451e9/go.mod h1:GgB8SF9nRG+GqaDtLcwJZsQFhcogVCJ79j4EdT0c2V4=
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54 h1:SG7nF6SRlWhcT7cNTs5R6Hk4V2lcmLz2NsG2VnInyNo=
github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA=
github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI=
github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
github.com/gin-contrib/sessions v0.0.0-20190101140330-dc5246754963/go.mod h1:4lkInX8nHSR62NSmhXM3xtPeMSyfiR58NaEz+om1lHM=
github.com/gin-contrib/sessions v1.0.1 h1:3hsJyNs7v7N8OtelFmYXFrulAf6zSR7nW/putcPEHxI=
github.com/gin-contrib/sessions v1.0.1/go.mod h1:ouxSFM24/OgIud5MJYQJLpy6AwxQ5EYO9yLhbtObGkM=
github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y=
github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8=
github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss=
github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA=
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A=
github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
github.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o=
github.com/gorilla/context v1.1.2/go.mod h1:KDPwT9i/MeWHiLl90fuTgrt4/wPcv75vFAZLaOOcbxM=
github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=
github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=
github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w=
github.com/gorilla/sessions v1.1.3/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w=
github.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY=
github.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8LRvBeoNcQ=
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 h1:L0QtFUgDarD7Fpv9jeVMgy/+Ec0mtnmYuImjTz6dtDA=
github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw=
github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A=
github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/kidstuff/mongostore v0.0.0-20181113001930-e650cd85ee4b/go.mod h1:g2nVr8KZVXJSS97Jo8pJ0jgq29P6H7dG0oplUA86MQw=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y=
github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
github.com/memcachier/mc v2.0.1+incompatible/go.mod h1:7bkvFE61leUBvXz+yxsOnGBQSZpBSPIMUQSmmSHvuXc=
github.com/microsoft/go-mssqldb v0.17.0 h1:Fto83dMZPnYv1Zwx5vHHxpNraeEaUlQ/hhHLgZiaenE=
github.com/microsoft/go-mssqldb v0.17.0/go.mod h1:OkoNGhGEs8EZqchVTtochlXruEhEOaO4S0d2sB5aeGQ=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/quasoft/memstore v0.0.0-20180925164028-84a050167438/go.mod h1:wTPjTepVu7uJBYgZ0SdWHQlIas582j6cn2jgk4DDdlg=
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sashabaranov/go-openai v1.30.3 h1:TEdRP3otRXX2A7vLoU+kI5XpoSo7VUUlM/rEttUqgek=
github.com/sashabaranov/go-openai v1.30.3/go.mod h1:lj5b/K+zjTSFxVLijLSTDZuP7adOgerWeFyZLUhAKRg=
github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
github.com/sosodev/duration v1.3.1 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq4=
github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg=
github.com/spurtcms/auth v0.0.44 h1:VRfWdorAPLgaQl2hend6oDpquO5Aiuv+HdQXd5VMaU4=
github.com/spurtcms/auth v0.0.44/go.mod h1:QDSbAUWyrGmCjvd2UHMPomBAk3TeUmjjZW5wnrInGSU=
github.com/spurtcms/blocks v0.0.59 h1:UFqbQr5GAvduEtTjFEzgNsqLttgfJ/CkbBbu4JfZFIc=
github.com/spurtcms/blocks v0.0.59/go.mod h1:VcEP1lN4eXyBb/hNwnyFwhPcujTdZupbSgNG7j+vJeI=
github.com/spurtcms/categories v0.0.33 h1:hrPIYcgkg7tS0s3C98j1F+GcT7+AtIyzMGgoYHf6W+g=
github.com/spurtcms/categories v0.0.33/go.mod h1:5YjyFKoY9vaGxtCCkvcZuA7jFcWnn1dadZ+e4C8OTSs=
github.com/spurtcms/channels v0.0.136 h1:PCSrWt02i6TfZ0N9pZYjXq8kUhXfLSjfErl8yWSvedc=
github.com/spurtcms/channels v0.0.136/go.mod h1:qt5RQJw6z5jGo5r/cuY/CqeGCe23nbo7awDmgw4OHPE=
github.com/spurtcms/courses v0.0.31 h1:SrruXJ4AgGEYQ8bkywO6I8XF06qUWQIMxpidkN/Gaj4=
github.com/spurtcms/courses v0.0.31/go.mod h1:gv/OktzG/VRy6fF4ja6wZmXKLV2fUI73CNKIlwaKnLI=
github.com/spurtcms/forms-builders v0.0.34 h1:Cq5RbEfJynkJGryYyh6y9AX2mRAUJGfs9HOX5iknTlw=
github.com/spurtcms/forms-builders v0.0.34/go.mod h1:MD7DOEu99VApmq2/Gl2DOSXaIMO22sLWh+OAW5JpWm0=
github.com/spurtcms/listing v0.0.31 h1:pQUW6pShBwcLNVjV2svuuiRieaCQMFSjPbr3O3+9SJ4=
github.com/spurtcms/listing v0.0.31/go.mod h1:eJPJsnNPSGz6tCoon7yKfAhNKDTctr9rutM17Me4u0E=
github.com/spurtcms/member v0.0.27 h1:4qOB6sXf2sj4NlEHF4+Y9Y8AAknVWaOaIekeCbBsnC0=
github.com/spurtcms/member v0.0.27/go.mod h1:jNwxQHW/o/MAqPCjnl0z/haMAreuhgEafsfc2DwhXrs=
github.com/spurtcms/member-access v0.0.10 h1:4u7y5/+IZGZJ+diB+1k/UrJpTNt0oIQXnSsdJjkKoaw=
github.com/spurtcms/member-access v0.0.10/go.mod h1:Ok/+dQX0afYU4WzdRVU3iQw5B1l+3zlTONHQRQMUOl8=
github.com/spurtcms/membership v0.0.26 h1:42P0fKWs9CA6llHm9GNeAvfRHL0IDzdhRUN49kkglfk=
github.com/spurtcms/membership v0.0.26/go.mod h1:uvn6cm4puxilQ2krc74ayOcn9Fns+usqdkn1BmD/Lh8=
github.com/spurtcms/menu v0.0.93 h1:oyNpoFHrewkqm4UQmPatIGm7g+5f11qxH53M87HNoDs=
github.com/spurtcms/menu v0.0.93/go.mod h1:0daQzFE3ri1oKWMHMpRMlvJMfEjpcd5N7lR91/DFLcg=
github.com/spurtcms/team v0.0.40 h1:RWbEefrp6up3VnU92G5Uni0sN5VxqKKlHhasoAfaZSs=
github.com/spurtcms/team v0.0.40/go.mod h1:XMtTNJbC605oe99XSKhzvPrr+J5/y3qUSxC2GQNyjf4=
github.com/spurtcms/team-roles v0.0.23 h1:ACPFjR/4w8P/p0sLagiswvtQ7LlhIhfRyUsRms2bXak=
github.com/spurtcms/team-roles v0.0.23/go.mod h1:h4yVYhuFtdloe8h+zS1qGnyyLUyEOEiI+ZkRxynEviM=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.2.3-0.20181224173747-660f15d67dbb/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stripe/stripe-go/v82 v82.1.0 h1:+05j4HAaC4vrkLo98e8CvJ3SeGVylij0kYPTOLeTYGg=
github.com/stripe/stripe-go/v82 v82.1.0/go.mod h1:majCQX6AfObAvJiHraPi/5udwHi4ojRvJnnxckvHrX8=
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/ugorji/go/codec v0.0.0-20181209151446-772ced7fd4c2/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
github.com/urfave/cli/v2 v2.27.5 h1:WoHEJLdsXr6dDWoJgMq/CboDmyY/8HMMH1fTECbih+w=
github.com/urfave/cli/v2 v2.27.5/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ=
github.com/utrack/gin-csrf v0.0.0-20190424104817-40fb8d2c8fca h1:lpvAjPK+PcxnbcB8H7axIb4fMNwjX9bE4DzwPjGg8aE=
github.com/utrack/gin-csrf v0.0.0-20190424104817-40fb8d2c8fca/go.mod h1:XXKxNbpoLihvvT7orUZbs/iZayg1n4ip7iJakJPAwA8=
github.com/vektah/gqlparser/v2 v2.5.22 h1:yaaeJ0fu+nv1vUMW0Hl+aS1eiv1vMfapBNjpffAda1I=
github.com/vektah/gqlparser/v2 v2.5.22/go.mod h1:xMl+ta8a5M1Yo1A1Iwt/k7gSpscwSnHZdw7tfhEGfTM=
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4=
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc=
golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04=
golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0=
golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA=
golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w=
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4=
golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210=
golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA=
golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=
golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ=
golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs=
google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y=
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/datatypes v1.2.0 h1:5YT+eokWdIxhJgWHdrb2zYUimyk0+TaFth+7a0ybzco=
gorm.io/datatypes v1.2.0/go.mod h1:o1dh0ZvjIjhH/bngTpypG6lVRJ5chTBxE09FH/71k04=
gorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=
gorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=
gorm.io/driver/postgres v1.5.9 h1:DkegyItji119OlcaLjqN11kHoUgZ/j13E0jkJZgD6A8=
gorm.io/driver/postgres v1.5.9/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI=
gorm.io/driver/sqlite v1.4.4 h1:gIufGoR0dQzjkyqDyYSCvsYR6fba1Gw5YKDqKeChxFc=
gorm.io/driver/sqlite v1.4.4/go.mod h1:0Aq3iPO+v9ZKbcdiz8gLWRw5VOPcBOPUQJFLq5e2ecI=
gorm.io/driver/sqlserver v1.4.1 h1:t4r4r6Jam5E6ejqP7N82qAJIJAht27EGT41HyPfXRw0=
gorm.io/driver/sqlserver v1.4.1/go.mod h1:DJ4P+MeZbc5rvY58PnmN1Lnyvb5gw5NPzGshHDnJLig=
gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs=
gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=
nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
+1
View File
@@ -0,0 +1 @@
package helper
+2102
View File
File diff suppressed because it is too large Load Diff
+14 -3
View File
@@ -155,6 +155,12 @@
"selling": "Selling",
"courses": "Courses",
"listing": "Listing",
"browsetheme": "Browse theme",
"pages": "Pages",
"seo":"SEO",
"menuitem": "Menu",
"Setting": {
"title": "Settings",
"manageroles": "Manage Roles",
@@ -235,7 +241,7 @@
"hosterr": "Please enter your the host",
"porterr": "Please enter your the port",
"imagetypeerror": "Please choose images with .jpg .jpeg .png .svg formats only",
"firstnamelable": " Your Last Name as per the records.",
"firstnamelable": " Your First Name as per the records.",
"lastlamelable": " Your Last Name for proper identification.",
"usernamelable": "The username that will be used for you to login.",
"rolelable": "Your role in the system, assigned by the admin, defining your access level.",
@@ -1123,6 +1129,8 @@
"Form Published Successfully": "Form published successfully",
"Form Unpublished Successfully": "Form unpublished successfully",
"Form Created Successfully": "Form created successfully",
"Ticket Closed Successfully":"Ticket Closed Successfully",
"Reply Submitted Successfully":"Reply Submitted Successfully",
"Form Updated Successfully": "Form updated successfully",
"EmailStatusUpdatedSuccessfully": "Email status updated successfully",
"ERRORAWScredentialsnotfound": "Upload failed: Check S3 credentials and try again.",
@@ -1178,7 +1186,10 @@
"Website Updated Successfully": "Website Updated Successfully",
"Page Created Successfully": "Page Created Successfully",
"Page Updated Successfully": "Page Updated Successfully",
"Page Deleted Successfully": "Page Deleted Successfully"
"Page Deleted Successfully": "Page Deleted Successfully",
"Widget Created Successfully": "Widget Created Successfully",
"Widget Updated Successfully": "Widget Updated Successfully",
"Widget Deleted Successfully": "Widget Deleted Successfully"
},
"DashBoard": {
"lastactive": "Last Active",
@@ -2304,7 +2315,7 @@
"pricemodelerr": "Please Select the pricing model for your course"
},
"Menu": {
"website": "Website",
"website": "Manage Website",
"templates": "Templates",
"seo": "SEO",
"setting": "Setting",
+17 -7
View File
@@ -154,6 +154,11 @@
"selling": "Venta",
"courses": "Cursos",
"listing": "Listado",
"browsetheme": "Explorar temas",
"pages": "Páginas",
"seo":"SEO",
"menuitem": "Menú",
"Toast": {
"User Created Successfully": "Usuario creado correctamente",
"User Updated Successfully": "La información del usuario se actualizó correctamente",
@@ -274,6 +279,8 @@
"Form Unpublished Successfully": "Formulario cancelado con éxito",
"Form Created Successfully": "Formulario creado con éxito",
"Form Updated Successfully": "Formulario actualizado con éxito",
"Ticket Closed Successfully": "Ticket cerrado exitosamente",
"Reply Submitted Successfully": "Respuesta enviada exitosamente",
"EmailStatusUpdatedSuccessfully": "El estado del correo electrónico se actualizó correctamente",
"ERRORAWScredentialsnotfound": "Error en la carga: Verifique las credenciales de S3 y vuelva a intentarlo.",
"Ctastatusnotify": "Estado de CTA actualizado correctamente",
@@ -319,12 +326,15 @@
"Listing Deleted Successfully": "Listado eliminado exitosamente",
"Listing Created Successfully": "Listado creado exitosamente",
"Listing Updated Successfully": "Listado actualizado exitosamente",
"Website Deleted Successfully":"Sitio web eliminado correctamente",
"Website Created Successfully":"Sitio web creado con éxito",
"Website Updated Successfully":"Sitio web actualizado exitosamente",
"Page Created Successfully":"Página creada con éxito",
"Page Updated Successfully":"Página actualizada correctamente",
"Page Deleted Successfully":"Página eliminada correctamente"
"Website Deleted Successfully": "Sitio web eliminado correctamente",
"Website Created Successfully": "Sitio web creado con éxito",
"Website Updated Successfully": "Sitio web actualizado exitosamente",
"Page Created Successfully": "Página creada con éxito",
"Page Updated Successfully": "Página actualizada correctamente",
"Page Deleted Successfully": "Página eliminada correctamente",
"Widget Created Successfully": "Widget creado correctamente",
"Widget Updated Successfully": "Widget actualizado correctamente",
"Widget Deleted Successfully": "Widget eliminado correctamente"
},
"Setting": {
"title": "Ajustes",
@@ -2319,7 +2329,7 @@
"labelname": "Nombre de la Etiqueta",
"labelnameplcholder": "Ingrese el nombre de la etiqueta",
"navigationpath": "Ruta de navegación",
"separatewindow":"Abrir como ventana separada",
"separatewindow": "Abrir como ventana separada",
"navplcholder": "Ingrese la ruta del enlace",
"additem": "Agregar elemento",
"labelnameerr": "Por favor, ingrese el nombre de la etiqueta",
+17 -7
View File
@@ -154,6 +154,11 @@
"selling": "Vente",
"courses": "Cours",
"listing": "Inscription",
"browsetheme": "Parcourir les thèmes",
"pages":"Pages",
"seo":"Référencement naturel",
"menuitem": "Menu",
"Setting": {
"title": "Paramètres",
"manageroles": "Gérer les rôles",
@@ -1117,6 +1122,8 @@
"Form Unpublished Successfully": "Formulaire non publié avec succès",
"Form Created Successfully": "Formulaire créé avec succès",
"Form Updated Successfully": "Formulaire mis à jour avec succès",
"Ticket Closed Successfully": "Ticket clôturé avec succès",
"Reply Submitted Successfully": "Réponse envoyée avec succès",
"Block Deleted Successfully": "Bloc supprimé avec succès",
"EmailStatusUpdatedSuccessfully": "Le statut du courriel a été mis à jour avec succès",
"ERRORAWScredentialsnotfound": "Échec du téléchargement : vérifiez les informations didentification S3 et réessayez.",
@@ -1163,12 +1170,15 @@
"Listing Deleted Successfully": "Annonce supprimée avec succès",
"Listing Created Successfully": "Liste créée avec succès",
"Listing Updated Successfully": "Liste mise à jour avec succès",
"Website Deleted Successfully":"Site Web supprimé avec succès",
"Website Created Successfully":"Site Web créé avec succès",
"Website Updated Successfully":"Site Web mis à jour avec succès",
"Page Created Successfully":"Page créée avec succès",
"Page Updated Successfully":"Page mise à jour avec succès",
"Page Deleted Successfully":"Page supprimée avec succès"
"Website Deleted Successfully": "Site Web supprimé avec succès",
"Website Created Successfully": "Site Web créé avec succès",
"Website Updated Successfully": "Site Web mis à jour avec succès",
"Page Created Successfully": "Page créée avec succès",
"Page Updated Successfully": "Page mise à jour avec succès",
"Page Deleted Successfully": "Page supprimée avec succès",
"Widget Created Successfully": "Widget créé avec succès",
"Widget Updated Successfully": "Widget mis à jour avec succès",
"Widget Deleted Successfully": "Widget supprimé avec succès"
},
"DashBoard": {
"lastactive": "Dernier actif",
@@ -2317,7 +2327,7 @@
"labelname": "Nom de l'Étiquette",
"labelnameplcholder": "Entrez le nom de l'étiquette",
"navigationpath": "Chemin de navigation",
"separatewindow":"Ouvrir comme fenêtre séparée",
"separatewindow": "Ouvrir comme fenêtre séparée",
"navplcholder": "Indiquez le chemin du lien",
"additem": "Ajouter un élément",
"labelnameerr": "Veuillez entrer le nom de l'étiquette",
+12 -2
View File
@@ -155,6 +155,11 @@
"selling": "Продажа",
"courses": "Курсы",
"listing": "Листинг",
"browsetheme": "Просмотр тем",
"pages":"Страницы",
"seo":"Сео",
"menuitem": "Меню",
"Setting": {
"title": "Настройки",
"manageroles": "Управление ролями",
@@ -1124,6 +1129,8 @@
"Form Unpublished Successfully": "Форма успешно отменена",
"Form Created Successfully": "Форма успешно создана",
"Form Updated Successfully": "Форма успешно обновлена",
"Ticket Closed Successfully": "Заявка успешно закрыта.",
"Reply Submitted Successfully": "Ответ успешно отправлен.",
"Block Deleted Successfully": "Блок успешно удален",
"EmailStatusUpdatedSuccessfully": "Статус электронной почты успешно обновлен",
"ERRORAWScredentialsnotfound": "Загрузка не удалась: проверьте учетные данные S3 и повторите попытку.",
@@ -1175,7 +1182,10 @@
"Website Updated Successfully": "Веб-сайт успешно обновлен",
"Page Created Successfully": "Страница успешно создана",
"Page Updated Successfully": "Страница успешно обновлена",
"Page Deleted Successfully": "Страница успешно удалена"
"Page Deleted Successfully": "Страница успешно удалена",
"Widget Created Successfully": "Виджет успешно создан",
"Widget Updated Successfully": "Виджет успешно обновлен",
"Widget Deleted Successfully": "Виджет успешно удален"
},
"DashBoard": {
"lastactive": "Последняя активность",
@@ -2380,4 +2390,4 @@
"pleaseenteryourwebsiteurl": "Пожалуйста, Введите URL Вашего Сайта",
"onlylowercaselettersandnumbersareallowed": "Разрешены только строчные буквы и цифры"
}
}
}
+74
View File
@@ -0,0 +1,74 @@
package logger
import (
"fmt"
"log"
"os"
)
var LogFilePath = "logs/error.log"
const (
InfoLevel = iota
WarningLevel
ErrorLevel
)
type Logger struct {
Level int
InfoLogger *log.Logger
WarnLogger *log.Logger
ErrorLogger *log.Logger
}
var logger *Logger
func init() {
_, err := os.Stat(LogFilePath)
var LogFile *os.File
if os.IsNotExist(err) {
makErr := os.MkdirAll("logs/", 0777)
if makErr != nil {
fmt.Println(makErr)
}
_, err = os.Create(LogFilePath)
if err != nil {
fmt.Printf("failed to create log file: %v\n",err)
}
fmt.Println("Created a new log file")
}
LogFile, err = os.OpenFile(LogFilePath, os.O_APPEND|os.O_WRONLY, 0666)
if err != nil {
fmt.Printf("failed to open log file: %v\n",err)
}
logger = &Logger{
Level: InfoLevel,
InfoLogger: log.New(LogFile, "INFO ", log.LstdFlags|log.Lshortfile),
WarnLogger: log.New(LogFile, "WARN ", log.LstdFlags|log.Lshortfile),
ErrorLogger: log.New(LogFile, "ERROR ", log.LstdFlags|log.Lshortfile),
}
}
func ErrorLog()*log.Logger{
return logger.ErrorLogger
}
func WarnLog()*log.Logger{
return logger.ErrorLogger
}
+52
View File
@@ -0,0 +1,52 @@
package main
import (
"os"
"spurt-cms/controllers"
"spurt-cms/migration"
templateview "spurt-cms/page-view"
"spurt-cms/routes"
storagecontroller "spurt-cms/storage-controller"
"sync"
)
func RunAdminPanel(wg *sync.WaitGroup) {
defer wg.Done()
r := routes.SetupRoutes() // setup routes
err := r.Run(":" + os.Getenv("PORT"))
if err != nil {
panic(err)
}
}
func main() {
migration.TableMigration() //migration all spurtcms related tables
migration.InsertDefaultValues() //insert default values....
storagecontroller.LocalStorageCreation() //create all project related files and folders
controllers.PackageInitialize() //initialize all spurtcms packages
controllers.LastUpdated()
var wg sync.WaitGroup
wg.Add(2)
go RunAdminPanel(&wg)
go templateview.RunTemplateView(&wg)
// go graphql.RunGraphqlServer(&wg)
wg.Wait()
}
+4169
View File
File diff suppressed because it is too large Load Diff
+292
View File
@@ -0,0 +1,292 @@
package middleware
import (
"fmt"
"os"
"spurt-cms/config"
"spurt-cms/controllers"
"spurt-cms/models"
// "strconv"
"github.com/dgrijalva/jwt-go"
"github.com/gin-gonic/gin"
)
// check the jwt token with authorized
func JWTAuth() gin.HandlerFunc {
return func(c *gin.Context) {
c.Header("Cache-Control", "no-store, no-cache, must-revalidate, private")
c.Header("Pragma", "no-cache")
c.Header("Expires", "0")
session, _ := controllers.Store.Get(c.Request, os.Getenv("SESSION_KEY"))
tkn := session.Values["token"]
if tkn == nil {
c.Abort()
c.Writer.Header().Set("Pragma", "no-cache")
c.Redirect(301, "/")
} else {
session.Values["token"] = tkn
session.Options.MaxAge = 60 * 60 * 24 * 90 //90 days
session.Save(c.Request, c.Writer)
token := tkn.(string)
userid, _, err := controllers.NewAuth.VerifyToken(token, os.Getenv("JWT_SECRET"))
if err != nil {
controllers.ErrorLog.Println("err", err)
}
Claims := jwt.MapClaims{}
tkn, err := jwt.ParseWithClaims(token, Claims, func(token *jwt.Token) (interface{}, error) {
return []byte(os.Getenv("JWT_SECRET")), nil
})
if err != nil {
if err == jwt.ErrSignatureInvalid {
fmt.Println(err)
return
}
fmt.Println(err)
c.Abort()
c.Writer.Header().Set("Pragma", "no-cache")
session.Options.MaxAge = -1
session.Save(c.Request, c.Writer)
for _, cookie := range c.Request.Cookies() {
c.SetCookie(cookie.Name, "", -1, "/", "", false, true)
}
c.Redirect(301, "/")
return
}
if !tkn.Valid {
fmt.Println(tkn)
return
}
// userid := Claims["user_id"]
// var user models.TblUser
controllers.Token = token
controllers.NewTeam.Auth.UserId = userid
user, _, _ := controllers.NewTeamWP.GetUserById(userid, []int{})
if user.Id == 0 {
c.Abort()
c.Writer.Header().Set("Pragma", "no-cache")
session.Options.MaxAge = -1
session.Save(c.Request, c.Writer)
for _, cookie := range c.Request.Cookies() {
c.SetCookie(cookie.Name, "", -1, "/", "", false, true)
}
c.Redirect(301, "/")
}
c.Set("default_language_id", user.DefaultLanguageId)
c.Set("tenant_id", user.TenantId)
c.Set("userDetails", user)
c.Set("go_template_default", user.GoTemplateDefault)
// host := c.Request.Host
// if strings.Contains(host, "spurtcms.com") {
// sub := strings.Split(host, ".")[0]
// if sub != "" {
// if sub != user.Subdomain {
// c.HTML(404, "nodata.html", nil)
// c.Abort()
// return
// }
// }
// } else if strings.Contains(host, "lvh.me") {
// sub := strings.Split(host, ".")[0]
// if sub != "" {
// if sub != user.Subdomain {
// c.HTML(404, "nodata.html", nil)
// c.Abort()
// return
// }
// }
// }
controllers.Tenant_Id(c)
//set middleware user datas
session.Values["userName"] = user.FirstName
session.Save(c.Request, c.Writer)
c.Set("username", user.FirstName)
c.Set("userid", user.Id)
c.Set("role", user.RoleId)
c.Set("dataaccess", user.DataAccess)
controllers.NewAuth.RoleId = user.RoleId
c.Header("Cache-Control", "no-cache, no-store, must-revalidate")
c.Header("Pragma", "no-cache")
c.Header("Expires", "0")
c.Next()
}
}
}
var db = config.SetupDB()
/*initial route call*/
func InitialPermissionsRoute(tblmodper *[]controllers.TblModulePermission, roleid int) error {
if err := db.Table("tbl_module_permissions").Select("route_name,display_name").Joins("inner join tbl_modules on tbl_modules.id=tbl_module_permissions.module_id").Joins("inner join tbl_role_permissions on tbl_role_permissions.permission_id=tbl_module_permissions.id").Where("tbl_role_permissions.role_id=? and tbl_module_permissions.display_name='View' or tbl_module_permissions.display_name='Member Access'", roleid).Find(&tblmodper).Error; err != nil {
return err
}
return nil
}
func GetModulePermissionByUserId(role *[]models.TblUser, id int) error {
if err := db.Table("tbl_users").Select("mpermission.display_name", "mpermission.module_id", "mpermission.route_name").Joins("inner join tbl_role_permissions on tbl_role_permissions.role_id = tbl_users.role_id").Joins("inner join tbl_module_permissions as mpermission on mpermission.id = tbl_role_permissions.permission_id").Where("tbl_users.id=?", id).Find(&role).Error; err != nil {
return err
}
return nil
}
func GetModuleIndividualAccessPermissionByUserId(role *[]models.TblUser, id int) error {
if err := db.Debug().Table("tbl_users").Select("mpermission.display_name", "mpermission.module_id", "mpermission.route_name", "mpermission.full_access_permission").Joins("inner join tbl_role_permissions on tbl_role_permissions.role_id = tbl_users.role_id").Joins("inner join tbl_module_permissions as mpermission on mpermission.id = tbl_role_permissions.permission_id").Where("tbl_users.id=?", id).Find(&role).Error; err != nil {
return err
}
return nil
}
func GetModuleFullAccessPermissionByUserId(role *[]models.TblUser, id int) error {
if err := db.Table("tbl_users").Select("mpermission.slug_name as display_name", "mpermission.module_id", "mpermission.route_name", "mpermission.full_access_permission").Joins("inner join tbl_role_permissions on tbl_role_permissions.role_id = tbl_users.role_id").Joins("inner join tbl_module_permissions as mpermission on mpermission.id = tbl_role_permissions.permission_id").Where("mpermission.full_access_permission = 1 and tbl_users.id=?", id).Find(&role).Error; err != nil {
return err
}
return nil
}
func TemplateJWTAuth() gin.HandlerFunc {
return func(c *gin.Context) {
c.Header("Cache-Control", "no-store, no-cache, must-revalidate, private")
c.Header("Pragma", "no-cache")
c.Header("Expires", "0")
session, err := controllers.Store.Get(c.Request, os.Getenv("TEMPLATE_SESSION_KEY"))
if err != nil {
fmt.Println(err.Error() + "TJWT001")
}
tkn, ok := session.Values["token"]
if !ok {
fmt.Println("token error occur")
}
if tkn == nil {
c.Abort()
c.Writer.Header().Set("Pragma", "no-cache")
c.Redirect(301, "/")
}
if tkn != nil {
token := tkn.(string)
member_id, err := VerifyToken(token, os.Getenv("JWT_SECRET"))
if err != nil {
controllers.ErrorLog.Println("err", err.Error()+"TJWT002")
}
c.Set("member_id", member_id)
} else {
fmt.Println("no token found:::")
c.Redirect(301, "/login")
c.Abort() // <<< VERY IMPORTANT
return
}
c.Next()
}
}
func VerifyToken(token string, secret string) (memberid int, err error) {
Claims := jwt.MapClaims{}
tkn, err := jwt.ParseWithClaims(token, Claims, func(token *jwt.Token) (interface{}, error) {
return []byte(secret), nil
})
if err != nil {
if err == jwt.ErrSignatureInvalid {
fmt.Println(err)
return 0, err
}
return 0, err
}
if !tkn.Valid {
fmt.Println(tkn)
return 0, err
}
member_id := Claims["member_id"]
return int(member_id.(float64)), nil
}
+78
View File
@@ -0,0 +1,78 @@
package middleware
import (
"fmt"
"os"
"spurt-cms/controllers"
"time"
"github.com/gin-gonic/gin"
csrf "github.com/utrack/gin-csrf"
)
func CSRFAuth() gin.HandlerFunc {
return csrf.Middleware(csrf.Options{
Secret: fmt.Sprintf("%8d", time.Now().Unix()),
IgnoreMethods: []string{"GET"},
ErrorFunc: func(c *gin.Context) {
csrftoken := c.PostForm("csrf")
if csrftoken != csrf.GetToken(c) {
sess, err := controllers.Store.Get(c.Request, os.Getenv("SESSION_KEY"))
if err != nil {
fmt.Println(err)
}
sess.Values["token"] = ""
sess.Options.MaxAge = -1
er := sess.Save(c.Request, c.Writer)
if er != nil {
fmt.Println(er)
}
c.Abort()
c.Writer.Header().Set("Pragma", "no-cache")
c.SetCookie("Alert-msg", "Internal Server Error", 3600, "", "", false, false)
fmt.Println("csrf token mismatch")
c.Redirect(301, "/")
} else {
c.Next()
}
},
})
}
func CorsMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With")
c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT")
if c.Request.Method == "OPTIONS" {
c.AbortWithStatus(204)
return
}
c.Next()
}
}
+93
View File
@@ -0,0 +1,93 @@
package middleware
import (
"fmt"
"net/http"
"os"
"spurt-cms/controllers"
"strconv"
"github.com/dgrijalva/jwt-go"
"github.com/gin-gonic/gin"
)
func DashBoardAuth() gin.HandlerFunc {
return func(c *gin.Context) {
session, _ := controllers.Store.Get(c.Request, os.Getenv("SESSION_KEY"))
tkn := session.Values["token"]
if tkn != "" && tkn != nil {
tkn := session.Values["token"].(string)
claims := jwt.MapClaims{}
token, err := jwt.ParseWithClaims(tkn, claims, func(token *jwt.Token) (interface{}, error) {
return []byte(os.Getenv("JWT_SECRET")), nil
})
if err != nil || !token.Valid {
c.Redirect(http.StatusFound, "/")
return
}
userIDFloat, ok := claims["user_id"].(float64)
if !ok {
c.Redirect(http.StatusFound, "/")
return
}
userID := int(userIDFloat)
user, _, _ := controllers.NewTeamWP.GetUserById(userID, []int{})
host := c.Request.Host
var redirectURL string
if host == "spurtcms.com" {
redirectURL = fmt.Sprintf("https://%s.spurtcms.com/admin/dashboard", user.FirstName+strconv.Itoa(user.Id))
} else {
redirectURL = fmt.Sprintf("http://%s.lvh.me:8080/admin/dashboard", user.Subdomain)
}
c.Writer.Header().Set("Pragma", "no-cache")
c.Redirect(301, redirectURL)
return
}
}
}
func TemplateDashBoardAuth() gin.HandlerFunc {
return func(c *gin.Context) {
session, _ := controllers.Store.Get(c.Request, os.Getenv("TEMPLATE_SESSION_KEY"))
tkn := session.Values["token"]
if tkn != "" && tkn != nil {
tkn := session.Values["token"].(string)
claims := jwt.MapClaims{}
token, err := jwt.ParseWithClaims(tkn, claims, func(token *jwt.Token) (interface{}, error) {
return []byte(os.Getenv("JWT_SECRET")), nil
})
if err != nil || !token.Valid {
c.Redirect(http.StatusFound, "/")
return
}
c.Redirect(301, "/")
return
}
}
}
+508
View File
@@ -0,0 +1,508 @@
package migration
import (
"bufio"
"fmt"
"log"
"os"
"spurt-cms/config"
"spurt-cms/migration/mysql"
"spurt-cms/migration/postgres"
"strconv"
"strings"
"time"
"github.com/google/uuid"
)
func TableMigration() {
if os.Getenv("DATABASE_TYPE") == "postgres" {
postgres.MigrationTables() //auto migrate table
} else if os.Getenv("DATABASE_TYPE") == "mysql" {
mysql.MigrationTables() //auto migrate table
}
}
func InsertDefaultValues() {
// Open the SQL file
file, err := os.Open("cms.sql")
if err != nil {
log.Println(err)
}
defer file.Close()
// Start a transaction
db := config.SetupDB()
// Create a new scanner to read the SQL file line by line
scanner := bufio.NewScanner(file)
for scanner.Scan() {
query := scanner.Text()
// Skip empty lines and comments
if len(strings.TrimSpace(query)) == 0 || strings.HasPrefix(query, "--") {
continue
}
currentTime, _ := time.Parse("2006-01-02 15:04:05", time.Now().UTC().Format("2006-01-02 15:04:05"))
parts := strings.Fields(fmt.Sprint(currentTime))
timeStamp := fmt.Sprintf("%s %s", parts[0], parts[1])
uuid := (uuid.New()).String()
arr := strings.Split(uuid, "-")
Uuid := arr[len(arr)-1]
query = strings.ReplaceAll(query, "current_time", timeStamp)
baseurl := os.Getenv("BASE_URL")
baseurl = strings.TrimPrefix(baseurl, "https://")
baseurl = strings.TrimPrefix(baseurl, "http://")
baseurl = strings.TrimSuffix(baseurl, "/")
query = strings.ReplaceAll(query, "base_url", baseurl)
if strings.Contains(query, "tbl_forms") {
query = strings.ReplaceAll(query, "uu_id", Uuid)
}
if strings.Contains(query, "tbl_block_tags") {
var defBlockIds []int
if err = db.Table("tbl_blocks").Select("id").Where("is_deleted=0 and tenant_id is NULL and block_description=?", "spurtcms").Scan(&defBlockIds).Error; err != nil {
log.Println(err)
}
for _, val := range defBlockIds {
modifiedQuery := strings.ReplaceAll(query, "blo_id", strconv.Itoa(val))
var exists bool
db.Table("tbl_block_tags").Select("count(*) > 0").Where("block_id = ?", val).Scan(&exists)
if !exists {
err := db.Exec(modifiedQuery).Error
if err != nil {
fmt.Println("Error executing query: \nQuery:", modifiedQuery, "\nError:", err)
}
} else {
}
}
continue
}
err := db.Exec(query).Error
if err != nil {
fmt.Println("Error executing query: \nQuery:", err, query)
}
}
if os.Getenv("DATABASE_TYPE") == "postgres" {
var (
module_count, mod_perm_count, role_count int64
user_count, channel_count, category_count int64
language_count, chancat_count, memgroup_count int64
personalize_count, block_count, blockmstrTag_count int64
blocktag_count, blockcolln_count, gensetting_count int64
template_count, tempmodule_count, emailConf_count, emailTemp_count, form_count, website_count, Subscription_count int64
)
if err := db.Table("tbl_modules").Count(&module_count).Error; err != nil {
log.Println(err)
}
if err := db.Table("tbl_module_permissions").Count(&mod_perm_count).Error; err != nil {
log.Println(err)
}
if err := db.Table("tbl_roles").Count(&role_count).Error; err != nil {
log.Println(err)
}
if err := db.Table("tbl_users").Count(&user_count).Error; err != nil {
log.Println(err)
}
if err := db.Table("tbl_channels").Count(&channel_count).Error; err != nil {
log.Println(err)
}
if err := db.Table("tbl_categories").Count(&category_count).Error; err != nil {
log.Println(err)
}
if err := db.Table("tbl_channel_categories").Count(&chancat_count).Error; err != nil {
log.Println(err)
}
if err := db.Table("tbl_member_groups").Count(&memgroup_count).Error; err != nil {
log.Println(err)
}
if err := db.Table("tbl_user_personalizes").Count(&personalize_count).Error; err != nil {
log.Println(err)
}
if err := db.Table("tbl_blocks").Count(&block_count).Error; err != nil {
log.Println(err)
}
if err := db.Table("tbl_block_mstr_tags").Count(&blockmstrTag_count).Error; err != nil {
log.Println(err)
}
if err := db.Table("tbl_block_tags").Count(&blocktag_count).Error; err != nil {
log.Println(err)
}
if err := db.Table("tbl_block_collections").Count(&blockcolln_count).Error; err != nil {
log.Println(err)
}
if err := db.Table("tbl_general_settings").Count(&gensetting_count).Error; err != nil {
log.Println(err)
}
if err := db.Table("tbl_templates").Count(&template_count).Error; err != nil {
log.Println(err)
}
if err := db.Table("tbl_template_modules").Count(&tempmodule_count).Error; err != nil {
log.Println(err)
}
if err := db.Table("tbl_email_configurations").Count(&emailConf_count).Error; err != nil {
log.Println(err)
}
if err := db.Table("tbl_email_templates").Count(&emailTemp_count).Error; err != nil {
log.Println(err)
}
if err := db.Table("tbl_forms").Count(&form_count).Error; err != nil {
log.Println(err)
}
if err := db.Table("tbl_mstr_membershiplevels").Count(&Subscription_count).Error; err != nil {
log.Println(err)
}
if err := db.Table("tbl_websites").Count(&website_count).Error; err != nil {
log.Println(err)
}
if module_count > 0 {
var moduleId int
if err := db.Raw("SELECT max(id) FROM tbl_modules").Row().Scan(&moduleId); err != nil {
// Handle error
log.Println(err)
}
db.Exec(fmt.Sprintf("ALTER SEQUENCE tbl_modules_id_seq RESTART WITH %d", moduleId+1))
}
if mod_perm_count > 0 {
var permissionmaxID int
if err := db.Raw("SELECT max(id) FROM tbl_module_permissions").Row().Scan(&permissionmaxID); err != nil {
// Handle error
log.Println(err)
}
db.Exec(fmt.Sprintf("ALTER SEQUENCE tbl_module_permissions_id_seq RESTART WITH %d", permissionmaxID+1))
}
if role_count > 0 {
var rolemaxID int
if err := db.Raw("SELECT max(id) FROM tbl_roles").Row().Scan(&rolemaxID); err != nil {
// Handle error
log.Println(err)
}
db.Exec(fmt.Sprintf("ALTER SEQUENCE tbl_roles_id_seq RESTART WITH %d", rolemaxID+1))
}
if user_count > 0 {
var usermaxID int
if err := db.Raw("SELECT max(id) FROM tbl_users").Row().Scan(&usermaxID); err != nil {
// Handle error
log.Println(err)
}
db.Exec(fmt.Sprintf("ALTER SEQUENCE tbl_users_id_seq RESTART WITH %d", usermaxID+1))
}
if channel_count > 0 {
var ChannelMaxid int
if err := db.Raw("SELECT max(id) FROM tbl_channels").Row().Scan(&ChannelMaxid); err != nil {
// Handle error
log.Println(err)
}
db.Exec(fmt.Sprintf("ALTER SEQUENCE tbl_channels_id_seq RESTART WITH %d", ChannelMaxid+1))
}
if category_count > 0 {
var CategoriesMaxId int
if err := db.Raw("SELECT max(id) FROM tbl_categories").Row().Scan(&CategoriesMaxId); err != nil {
// Handle error
log.Println(err)
}
db.Exec(fmt.Sprintf("ALTER SEQUENCE tbl_categories_id_seq RESTART WITH %d", CategoriesMaxId+1))
}
if language_count > 0 {
var LangMaxId int
if err := db.Raw("SELECT max(id) FROM tbl_languages").Row().Scan(&LangMaxId); err != nil {
// Handle error
log.Println(err)
}
db.Exec(fmt.Sprintf("ALTER SEQUENCE tbl_languages_id_seq RESTART WITH %d", LangMaxId+1))
}
if chancat_count > 0 {
var ChannelCatMaxId int
if err := db.Raw("SELECT max(id) FROM tbl_channel_categories").Row().Scan(&ChannelCatMaxId); err != nil {
// Handle error
log.Println(err)
}
db.Exec(fmt.Sprintf("ALTER SEQUENCE tbl_channel_categories_id_seq RESTART WITH %d", ChannelCatMaxId+1))
}
if memgroup_count > 0 {
var GroupMaxId int
if err := db.Raw("SELECT max(id) FROM tbl_member_groups").Row().Scan(&GroupMaxId); err != nil {
// Handle error
log.Println(err)
}
db.Exec(fmt.Sprintf("ALTER SEQUENCE tbl_member_groups_id_seq RESTART WITH %d", GroupMaxId+1))
}
if personalize_count > 0 {
var UserPersonalizeId int
if err := db.Raw("SELECT max(id) FROM tbl_user_personalizes").Row().Scan(&UserPersonalizeId); err != nil {
// Handle error
log.Println(err)
}
db.Exec(fmt.Sprintf("ALTER SEQUENCE tbl_user_personalizes_id_seq RESTART WITH %d", UserPersonalizeId+1))
}
if block_count > 0 {
var BlockMaxId int
if err := db.Raw("SELECT max(id) FROM tbl_blocks").Row().Scan(&BlockMaxId); err != nil {
// Handle error
log.Println(err)
}
db.Exec(fmt.Sprintf("ALTER SEQUENCE tbl_blocks_id_seq RESTART WITH %d", BlockMaxId+1))
}
if blockmstrTag_count > 0 {
var MstrTagMaxId int
if err := db.Raw("SELECT max(id) FROM tbl_block_mstr_tags").Row().Scan(&MstrTagMaxId); err != nil {
// Handle error
log.Println(err)
}
db.Exec(fmt.Sprintf("ALTER SEQUENCE tbl_block_mstr_tags_id_seq RESTART WITH %d", MstrTagMaxId+1))
}
if blocktag_count > 0 {
var TagMaxId int
if err := db.Raw("SELECT max(id) FROM tbl_block_tags").Row().Scan(&TagMaxId); err != nil {
// Handle error
log.Println(err)
}
db.Exec(fmt.Sprintf("ALTER SEQUENCE tbl_block_tags_id_seq RESTART WITH %d", TagMaxId+1))
}
if blockcolln_count > 0 {
var CollectionMaxId int
if err := db.Raw("SELECT max(id) FROM tbl_block_collections").Row().Scan(&CollectionMaxId); err != nil {
// Handle error
log.Println(err)
}
db.Exec(fmt.Sprintf("ALTER SEQUENCE tbl_block_collections_id_seq RESTART WITH %d", CollectionMaxId+1))
}
if gensetting_count > 0 {
var GenSettingMaxId int
if err := db.Raw("SELECT COALESCE((select max(id) from tbl_general_settings),0)").Scan(&GenSettingMaxId); err != nil {
// Handle error
log.Println(err)
}
db.Exec(fmt.Sprintf("ALTER SEQUENCE tbl_general_settings_id_seq RESTART WITH %v", GenSettingMaxId+1))
}
if template_count > 0 {
var TemplateMaxId int
if err := db.Raw("SELECT COALESCE((select max(id) from tbl_templates),0)").Scan(&TemplateMaxId); err != nil {
// Handle error
log.Println(err)
}
db.Exec(fmt.Sprintf("ALTER SEQUENCE tbl_templates_id_seq RESTART WITH %v", TemplateMaxId+1))
}
if tempmodule_count > 0 {
var templateModuleMaxId int
if err := db.Raw("SELECT COALESCE((select max(id) from tbl_template_modules),0)").Scan(&templateModuleMaxId); err != nil {
// Handle error
log.Println(err)
}
db.Exec(fmt.Sprintf("ALTER SEQUENCE tbl_template_modules_id_seq RESTART WITH %v", templateModuleMaxId+1))
}
if emailConf_count > 0 {
var emailConfMaxId int
if err := db.Raw("SELECT COALESCE((select max(id) from tbl_email_configurations),0)").Scan(&emailConfMaxId); err != nil {
// Handle error
log.Println(err)
}
db.Exec(fmt.Sprintf("ALTER SEQUENCE tbl_email_configurations_id_seq RESTART WITH %v", emailConfMaxId+1))
}
if emailTemp_count > 0 {
var emailTempMaxId int
if err := db.Raw("SELECT COALESCE((select max(id) from tbl_email_templates),0)").Scan(&emailTempMaxId); err != nil {
// Handle error
log.Println(err)
}
db.Exec(fmt.Sprintf("ALTER SEQUENCE tbl_email_templates_id_seq RESTART WITH %v", emailTempMaxId+1))
}
if Subscription_count > 0 {
var subscriptionMaxId int
if err := db.Raw("SELECT COALESCE((select max(id) from tbl_mstr_membershiplevels),0)").Scan(&subscriptionMaxId); err != nil {
// Handle error
log.Println(err)
}
db.Exec(fmt.Sprintf("ALTER SEQUENCE tbl_mstr_membershiplevels_id_seq RESTART WITH %v", subscriptionMaxId+1))
}
if website_count > 0 {
var WebsiteMaxid int
if err := db.Raw("SELECT max(id) FROM tbl_websites").Row().Scan(&WebsiteMaxid); err != nil {
// Handle error
log.Println(err)
}
db.Exec(fmt.Sprintf("ALTER SEQUENCE tbl_websites_id_seq RESTART WITH %d", WebsiteMaxid+1))
}
}
fmt.Println("SQL file loaded successfully.")
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+115
View File
@@ -0,0 +1,115 @@
package models
import (
"database/sql"
"time"
)
type TblApps struct {
Id int `gorm:"primaryKey;auto_increment;type:serial"`
Title string `gorm:"type:character varying"`
Description string `gorm:"type:character varying"`
FieldJsonPath string `gorm:"type:character varying"`
IconName string `gorm:"type:character varying"`
IconPath string `gorm:"type:character varying"`
CreatedBy int `gorm:"type:integer"`
CreatedOn time.Time `gorm:"type:timestamp without time zone"`
ModifiedBy int `gorm:"type:integer;DEFAULT:NULL"`
ModifiedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
IsActive int `gorm:"type:integer;DEFAULT:NULL"`
IsDeleted int `gorm:"type:integer;DEFAULT:0"`
DeletedBy int `gorm:"type:integer;DEFAULT:NULL"`
DeletedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
TenantId string `gorm:"type:character varying;DEFAULT:NULL"`
CustomFields map[string]interface{} `gorm:"-"`
ChannelSlug string `gorm:"type:character varying"`
}
type TblAiPrompt struct {
Id int `gorm:"primaryKey;auto_increment;type:serial"`
AppId int `gorm:"type:integer;DEFAULT:NULL"`
MasterId int `gorm:"type:integer;DEFAULT:NULL"`
ChildId int `gorm:"type:integer;DEFAULT:NULL"`
PromptLevel int `gorm:"type:integer;DEFAULT:NULL"`
LanguageId int `gorm:"type:integer;DEFAULT:NULL"`
SystemPrompt string `gorm:"type:character varying"`
UserPrompt string `gorm:"type:character varying"`
CreatedBy int `gorm:"type:integer"`
CreatedOn time.Time `gorm:"type:timestamp without time zone"`
ModifiedBy int `gorm:"type:integer;DEFAULT:NULL"`
ModifiedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
IsActive int `gorm:"type:integer;DEFAULT:NULL"`
IsDeleted int `gorm:"type:integer;DEFAULT:0"`
DeletedBy int `gorm:"type:integer;DEFAULT:NULL"`
DeletedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
TenantId string `gorm:"type:character varying;DEFAULT:NULL"`
}
func GetAppList(keyword string, tenant string) (tblapp []TblApps, count int64, err error) {
query := DB.Debug().Model(TblApps{}).Where("tbl_apps.is_deleted = 0 and tbl_apps.is_active = 1")
if keyword != "" {
query = query.Where("(LOWER(TRIM(tbl_apps.title)) ILIKE LOWER(TRIM(?)))", "%"+keyword+"%")
}
listQuery := query.Find(&tblapp)
if listQuery.Error != nil {
return tblapp, -1, listQuery.Error
}
countQuery := query.Count(&count)
if countQuery.Error != nil {
return tblapp, -1, countQuery.Error
}
return tblapp, count, nil
}
func GetAiPrompts(aiprompt *TblAiPrompt, id int) error {
if err := DB.Table("tbl_ai_prompts").Select("tbl_ai_prompts.*").Where("is_deleted=0 and id = ?", id).First(&aiprompt).Error; err != nil {
return err
}
return nil
}
func ArticleCountUpdate(userid int, tenantid string) error {
var currentCount sql.NullInt64
if err := DB.Debug().Table("tbl_users").Select("article_count").Where("id = ? AND tenant_id =?", userid, tenantid).Scan(&currentCount).Error; err != nil {
return err
}
var newCount int64
if !currentCount.Valid {
newCount = 1
} else {
newCount = currentCount.Int64 + 1
}
if err := DB.Debug().Table("tbl_users").Where("id = ? AND tenant_id=?", userid, tenantid).UpdateColumns(map[string]interface{}{"article_count": newCount}).Error; err != nil {
return err
}
return nil
}
//Get ArticleCount//
func GetArticleCount(userid int, tenantid string) (TblUser, error) {
var userDetails TblUser
if err := DB.Table("tbl_users").Where("id=? and tenant_id=?", userid, tenantid).First(&userDetails).Error; err != nil {
return TblUser{}, err
}
return userDetails, nil
}
+117
View File
@@ -0,0 +1,117 @@
package models
import (
"time"
)
type TblAiSettingsModule struct {
Id int `gorm:"primaryKey;auto_increment;type:serial"`
AIModule string `gorm:"type:character varying"`
ApiKey string `gorm:"type:character varying"`
Description string `gorm:"type:character varying"`
AiModel string `gorm:"type:character varying"`
IsActive int `gorm:"type:integer"`
CreatedOn time.Time `gorm:"type:timestamp without time zone"`
CreatedBy int `gorm:"type:integer"`
IsDeleted int `gorm:"type:integer"`
DeletedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
DeletedBy int `gorm:"DEFAULT:NULL"`
ModifiedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
ModifiedBy int `gorm:"DEFAULT:NULL"`
TenantId string `gorm:"type:integer"`
DateString string `gorm:"-"`
}
func CreateAiModule(module TblAiSettingsModule) (bool, error) {
if err := DB.Create(&module).Error; err != nil {
return false, err
}
return true, nil
}
func ListAiModule(limit, offset int, filter Filter, tenantid string) (list []TblAiSettingsModule, count int64, err error) {
var aimodule []TblAiSettingsModule
query := DB.Table("tbl_ai_settings_modules").Where("is_deleted=0 and tenant_id=?", tenantid).Order("created_on desc")
if filter.Keyword != "" {
query = query.Where("LOWER(TRIM(tbl_ai_settings_modules.ai_module)) like LOWER(TRIM(?))", "%"+filter.Keyword+"%")
}
if limit != 0 {
query.Limit(limit).Offset(offset).Find(&aimodule)
return aimodule, count, nil
}
query.Find(&aimodule).Count(&count)
return aimodule, count, nil
}
func StatusChange(id, isactive, modifiedby int, tenantid string) (bool, error) {
result := DB.Table("tbl_ai_settings_modules").
Where("id = ? AND tenant_id = ?", id, tenantid).UpdateColumns(map[string]interface{}{"is_active": isactive})
if result.Error != nil {
return false, result.Error
}
result = DB.Table("tbl_ai_settings_modules").
Where("id != ? AND tenant_id = ?", id, tenantid).UpdateColumns(map[string]interface{}{"is_active": 0})
if result.Error != nil {
return false, result.Error
}
return true, nil
}
func UpdateAiModule(module TblAiSettingsModule) (bool, error) {
result := DB.Table("tbl_ai_settings_modules").
Where("id = ? AND tenant_id = ?", module.Id, module.TenantId).UpdateColumns(map[string]interface{}{"ai_module": module.AIModule, "api_key": module.ApiKey, "description": module.Description, "ai_model": module.AiModel, "modified_by": module.ModifiedBy, "modified_on": module.ModifiedOn})
if result.Error != nil {
return false, result.Error
}
return true, nil
}
func DeleteModule(id, userid int, tenantid string) (bool, error) {
deletedon, _ := time.Parse("2006-01-02 15:04:05", time.Now().UTC().Format("2006-01-02 15:04:05"))
result := DB.Table("tbl_ai_settings_modules").
Where("id = ? AND tenant_id = ?", id, tenantid).UpdateColumns(map[string]interface{}{"is_deleted": "1", "deleted_by": userid, "modified_on": deletedon})
if result.Error != nil {
return false, result.Error
}
return true, nil
}
func MultiSelectDelete(moduleids []int, userid int, tenantid string) (bool, error) {
deletedon, _ := time.Parse("2006-01-02 15:04:05", time.Now().UTC().Format("2006-01-02 15:04:05"))
if err := DB.Table("tbl_ai_settings_modules").Where("id in (?) and tenant_id=?", moduleids, tenantid).UpdateColumns(map[string]interface{}{"is_deleted": "1", "deleted_on": deletedon, "deleted_by": userid}).Error; err != nil {
return false, err
}
return true, nil
}
+149
View File
@@ -0,0 +1,149 @@
package models
import (
"time"
"gorm.io/datatypes"
)
type TblMstrBlocks struct {
Id int `gorm:"primaryKey;auto_increment;type:serial"`
Title string `gorm:"type:character varying"`
SlugName string `gorm:"type:character varying"`
ChannelSlugname string `gorm:"type:character varying"`
BlockDescription string `gorm:"type:text"`
BlockContent string `gorm:"type:text"`
BlockCss string `gorm:"type:text"`
CoverImage string `gorm:"type:character varying"`
IconImage string `gorm:"type:character varying"`
TenantId int `gorm:"type:integer"`
Prime int `gorm:"type:integer"`
IsActive int `gorm:"type:integer"`
CreatedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
CreatedBy int `gorm:"type:integer"`
ModifiedBy int `gorm:"type:integer"`
ModifiedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
DeletedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
DeletedBy int `gorm:"type:integer;DEFAULT:NULL"`
IsDeleted int `gorm:"type:integer;DEFAULT:0"`
ProfileImagePath string `gorm:"<-:false"`
FirstName string `gorm:"<-:false"`
LastName string `gorm:"<-:false"`
Username string `gorm:"<-:false"`
TagValueArr []string `gorm:"-"`
TagValue string `gorm:"<-:false;"`
NameString string `gorm:"-"`
Actions string `gorm:"<-:false"`
CreatedDate string `gorm:"-:migration;<-:false"`
ModifiedDate string `gorm:"-:migration;<-:false"`
ChannelID string `gorm:"type:character varying"`
ChannelNames []string `gorm:"-"`
}
type TblMstrForms struct {
Id int `gorm:"primaryKey;auto_increment;type:serial"`
FormTitle string `gorm:"type:character varying"`
FormSlug string `gorm:"type:character varying"`
FormData string `gorm:"type:character varying"`
Status int `gorm:"type:integer"`
IsActive int `gorm:"type:integer"`
CreatedBy int `gorm:"type:integer"`
CreatedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
ModifiedBy int `gorm:"type:integer;DEFAULT:NULL"`
ModifiedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
DeletedBy int `gorm:"type:integer;DEFAULT:NULL"`
DeletedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
IsDeleted int `gorm:"type:integer;DEFAULT:0"`
TenantId int `gorm:"type:integer"`
Uuid string `gorm:"type:character varying"`
Username string `gorm:"<-:false"`
ProfileImagePath string `gorm:"<-:false"`
NameString string `gorm:"<-:false"`
FirstName string `gorm:"<-:false"`
LastName string `gorm:"<-:false"`
DateString string `gorm:"-"`
CreatedDate string `gorm:"-:migration;<-:false"`
ModifiedDate string `gorm:"-:migration;<-:false"`
FormImagePath string `gorm:"type:character varying"`
FormDescription string `gorm:"type:character varying"`
ChannelId string `gorm:"type:character varying"`
ChannelName string `gorm:"type:character varying"`
Channelnamearr []string `gorm:"-"`
FormPreviewImagepath string `gorm:"type:character varying"`
FormPreviewImagename string `gorm:"type:character varying"`
}
type TblMstrchannel struct {
Id int `gorm:"column:id"`
ChannelName string `gorm:"column:channel_name"`
ChannelDescription string `gorm:"column:channel_description"`
SlugName string `gorm:"column:slug_name"`
FieldGroupId int `gorm:"column:field_group_id"`
IsActive int `gorm:"column:is_active"`
IsDeleted int `gorm:"column:is_deleted"`
CreatedOn time.Time `gorm:"column:created_on"`
CreatedBy int `gorm:"column:created_by"`
ModifiedOn time.Time `gorm:"column:modified_on;DEFAULT:NULL"`
ModifiedBy int `gorm:"column:modified_by;DEFAULT:NULL"`
DateString string `gorm:"-"`
ProfileImagePath string `gorm:"<-:false"`
AuthorDetails TblUser `gorm:"foreignKey:Id;references:CreatedBy"`
ChannelType string `gorm:"column:channel_type"`
TenantId int `gorm:"column:tenant_id"`
Username string `gorm:"<-:false"`
FirstName string `gorm:"<-:false"`
LastName string `gorm:"<-:false"`
NameString string `gorm:"<-:false"`
ImagePath string `gorm:"column:image_path"`
}
// type TblMstrIntegration struct {
// Id int `gorm:"primaryKey;auto_increment;type:serial"`
// ClientId string `gorm:"type:character varying"`
// ClientSecret string `gorm:"type:character varying"`
// CoverImage string `gorm:"type:character varying"`
// GatewayName string `gorm:"type:character varying"`
// GatewayDesc string `gorm:"type:character varying"`
// IsActive int `gorm:"type:integer"`
// CreatedOn time.Time `gorm:"type:timestamp without time zone"`
// CreatedBy int `gorm:"type:integer"`
// IsDeleted int `gorm:"type:integer"`
// DeletedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
// DeletedBy int `gorm:"DEFAULT:NULL"`
// ModifiedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
// ModifiedBy int `gorm:"DEFAULT:NULL"`
// TenantId string `gorm:"type:character varying"`
// }
type TblMstrIntegration struct {
Id int `gorm:"primaryKey;auto_increment;type:serial" json:"id"`
Credentials datatypes.JSON `gorm:"type:jsonb" json:"credentials"` // e.g., AWS keys, bucket info, etc.
IntegrationType string `gorm:"type:character varying" json:"integration_type"` // e.g., "AWS", "GCP", "Azure"
IsActive int `gorm:"type:integer" json:"is_active"`
CreatedOn time.Time `gorm:"type:timestamp without time zone" json:"created_on"`
CreatedBy int `gorm:"type:integer" json:"created_by"`
IsDeleted int `gorm:"type:integer" json:"is_deleted"`
DeletedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL" json:"deleted_on"`
DeletedBy int `gorm:"DEFAULT:NULL" json:"deleted_by"`
ModifiedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL" json:"modified_on"`
ModifiedBy int `gorm:"DEFAULT:NULL" json:"modified_by"`
TenantId string `gorm:"type:character varying" json:"tenant_id"`
}
type IntegrationView struct {
Id int `json:"id"`
Credentials Credentials `json:"credentials"`
IsActive int `json:"is_active"`
IntegrationType string `json:"integration_type"`
}
type Credentials struct {
GatewayName string `json:"gateway_name"`
GatewayDesc string `json:"gateway_desc"`
BucketName string `json:"bucket_name"`
Region string `json:"region"`
AccessKey string `json:"access_key"`
SecretKey string `json:"secret_key"`
CoverImage string `json:"cover_image"`
}
+134
View File
@@ -0,0 +1,134 @@
package models
import (
"time"
chn "github.com/spurtcms/channels"
"gorm.io/gorm"
)
var IST, _ = time.LoadLocation("Asia/Kolkata")
type TblCategory struct {
Id int
CategoryName string
CategorySlug string
Description string
ImagePath string
CreatedOn time.Time
CreatedBy int
ModifiedOn time.Time `gorm:"DEFAULT:NULL"`
ModifiedBy int `gorm:"DEFAULT:NULL"`
IsDeleted int
DeletedOn time.Time `gorm:"DEFAULT:NULL"`
DeletedBy int `gorm:"DEFAULT:NULL"`
ParentId int
CreatedDate string `gorm:"-"`
ModifiedDate string `gorm:"-"`
DateString string `gorm:"-"`
ParentCategoryName string `gorm:"-"`
Parent []string `gorm:"-"`
ParentWithChild []Result `gorm:"-"`
}
type Result struct {
CategoryName string
}
type TblChannelEntries struct {
Id int
Title string `form:"title" binding:"required"`
Slug string `form:"slug" binding:"required"`
Description string
UserId int
ChannelId int
Status int //0-draft 1-publish 2-unpublish
IsActive int
IsDeleted int `gorm:"DEFAULT:0"`
DeletedBy int `gorm:"DEFAULT:NULL"`
DeletedOn time.Time `gorm:"DEFAULT:NULL"`
CreatedOn time.Time
CreatedBy int
ModifiedBy int `gorm:"DEFAULT:NULL"`
ModifiedOn time.Time `gorm:"DEFAULT:NULL"`
CoverImage string
ThumbnailImage string
MetaTitle string `form:"metatitle" binding:"required"`
MetaDescription string `form:"metadesc" binding:"required"`
Keyword string `form:"keywords" binding:"required"`
CategoriesId string
RelatedArticles string
CreatedDate string `gorm:"-"`
ModifiedDate string `gorm:"-"`
Username string `gorm:"<-:false"`
TblChannelEntryField []TblChannelEntryField `gorm:"<-:false; foreignKey:ChannelEntryId"`
Category []TblCategory `gorm:"<-:false; foreignKey:Id"`
CategoryGroup string `gorm:"<-:false"`
ChannelName string `gorm:"<-:false"`
Cno int `gorm:"<-:false"`
}
type TblChannelEntryField struct {
Id int
FieldName string
FieldValue string
ChannelEntryId int
FieldId int
CreatedOn time.Time
CreatedBy int
ModifiedOn time.Time `gorm:"DEFAULT:NULL"`
ModifiedBy int `gorm:"DEFAULT:NULL"`
FieldTypeId int `gorm:"<-:false"`
}
type ExportData struct {
Title string
CreatedBy string
CreatedDate string
Status string
}
type TblModule struct {
Id int
ModuleName string
IsActive int
CreatedBy int
CreatedOn time.Time
CreatedDate string `gorm:"<-:false"`
DefaultModule int
ParentId int
IconPath string
OrderIndex int
Description string
DisplayName string `gorm:"column:display_name;<-:false"`
RouteName string `gorm:"column:route_name;<-:false"`
RouteParentId int `gorm:"column:parent_id;<-:false"`
FullAccessPermission int
GroupFlg int
}
func Exportentriesdata(exportdata *[]chn.Tblchannelentries, id []int, tenantid string) error {
if err := DB.Table("tbl_channel_entries").Select("tbl_channel_entries.*,tbl_users.username,tbl_channels.channel_name").Joins("inner join tbl_users on tbl_users.id = tbl_channel_entries.created_by").Joins("inner join tbl_channels on tbl_channels.id = tbl_channel_entries.channel_id").Where("tbl_channel_entries.is_deleted=0 and tbl_channel_entries.id IN ? and (tbl_channel_entries.tenant_id is NULL or tbl_channel_entries.tenant_id = ?)", id, tenantid).Order("tbl_channel_entries.id desc").Preload("TblChannelEntryField", func(db *gorm.DB) *gorm.DB {
return db.Select("tbl_channel_entry_fields.*,tbl_fields.field_type_id").Joins("inner join tbl_fields on tbl_fields.Id = tbl_channel_entry_fields.field_id")
}).Find(&exportdata).Error; err != nil {
return err
}
return nil
}
func Entryid(entry string, tenantid string) (Id int, err error) {
var modules TblModule
if err := DB.Table("tbl_modules").Where("module_name=? and parent_id!=?", entry, 0).First(&modules).Error; err != nil {
return 0, err
}
id := modules.Id
return id, nil
}
+33
View File
@@ -0,0 +1,33 @@
package models
import (
"time"
)
type TblCountrie struct {
Id int `gorm:"primaryKey;auto_increment;type:serial"`
CountryCode string `gorm:"type:character varying"`
CountryName string `gorm:"type:character varying"`
IsActive int `gorm:"type:integer"`
CreatedOn time.Time `gorm:"type:timestamp without time zone"`
CreatedBy int `gorm:"type:integer"`
IsDeleted int `gorm:"type:integer"`
DeletedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
DeletedBy int `gorm:"DEFAULT:NULL"`
ModifiedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
ModifiedBy int `gorm:"DEFAULT:NULL"`
TenantId int `gorm:"type:integer"`
}
func GetCountryLIst()([]TblCountrie,error){
var CountryList []TblCountrie
if err := DB.Table("tbl_countries").Find(&CountryList).Error; err != nil {
return []TblCountrie{},err
}
return CountryList,nil
}
+34
View File
@@ -0,0 +1,34 @@
package models
import "gorm.io/datatypes"
type TblEmailConfigurations struct {
Id int
SmtpConfig datatypes.JSONMap `gorm:"type:jsonb"`
SelectedType string `gorm:"type:varchar(255)"`
}
type SmtpConfig struct {
Mail string
Password string
Host string
Port string
}
func GetMail(mail *TblEmailConfigurations, tenantid string) error {
if err := DB.Table("tbl_email_configurations").Where("tenant_id = ?", tenantid).First(&mail).Error; err != nil {
return err
}
return nil
}
func UpdateMail(mail *TblEmailConfigurations, tenantid string) (upadtemail *TblEmailConfigurations, err error) {
if err := DB.Debug().Table("tbl_email_configurations").Where("tenant_id = ?", tenantid).UpdateColumns(map[string]interface{}{"selected_type": mail.SelectedType, "smtp_config": mail.SmtpConfig}).Error; err != nil {
return &TblEmailConfigurations{}, err
}
return mail, nil
}
+186
View File
@@ -0,0 +1,186 @@
package models
import (
"fmt"
"spurt-cms/config"
"time"
)
type Filter struct {
Keyword string
ChannelName string
Status string
Title string
Category string
}
type TblEmailTemplate struct {
Id int
TemplateName string
TemplateSubject string
TemplateMessage string
TemplateDescription string
ModuleId int
CreatedOn time.Time
CreatedBy int
ModifiedOn time.Time `gorm:"DEFAULT:NULL"`
ModifiedBy int `gorm:"DEFAULT:NULL"`
DeletedOn time.Time `gorm:"DEFAULT:NULL"`
DeletedBy int `gorm:"DEFAULT:NULL"`
IsDeleted int `gorm:"DEFAULT:0"`
IsActive int
IsDefault int
DateString string `gorm:"-"`
TemplateSlug string
TenantId string `gorm:"DEFAULT:1"`
}
type TblImportfileLogs struct {
Id int
FileName string
TotalFields int
MappedFields int
UnmappedFields int
CreatedOn time.Time
CreatedBy int
Status int
DateString string `gorm:"-"`
TenantId string `gorm:"DEFAULT:1"`
}
var DB = config.SetupDB()
func GetTemplateList(templates *[]TblEmailTemplate, limit, offset int, filter Filter, flag bool, tenantid string) ([]TblEmailTemplate, int64) {
var Total_templates int64
var emptyslice []TblEmailTemplate
query := DB.Debug().Table("tbl_email_templates").Where("tbl_email_templates.is_deleted=0 and tbl_email_templates.module_id=0 and tbl_email_templates.tenant_id=?", tenantid).Order("id desc")
if filter.Keyword != "" {
query = query.Where("(LOWER(TRIM(tbl_email_templates.template_name)) ILIKE LOWER(TRIM(?)))", "%"+filter.Keyword+"%")
}
if flag {
query.Find(&templates)
return *templates, 0
}
if limit != 0 && !flag {
query.Offset(offset).Limit(limit).Find(&templates)
return *templates, 0
} else {
query.Find(&templates).Count(&Total_templates)
return emptyslice, Total_templates
}
}
func GetTempdetail(temp *TblEmailTemplate, id int, _ string) error {
if err := DB.Table("tbl_email_templates").Where("is_deleted =0 and id=?", id).First(&temp).Error; err != nil {
return err
}
return nil
}
func UpdateTemplate(template *TblEmailTemplate, _ string) error {
if err := DB.Table("tbl_email_templates").Where("is_deleted=0 and id=?", template.Id).Updates(TblEmailTemplate{TemplateName: template.TemplateName, TemplateSubject: template.TemplateSubject, TemplateMessage: template.TemplateMessage, Id: template.Id, ModifiedOn: template.ModifiedOn, ModifiedBy: template.ModifiedBy, TemplateDescription: template.TemplateDescription}).Error; err != nil {
return err
}
return nil
}
func TemplateStatus(id int, status int, userid int, _ string) error {
var Tempstatus TblEmailTemplate
Tempstatus.ModifiedBy = userid
Tempstatus.ModifiedOn, _ = time.Parse("2006-01-02 15:04:05", time.Now().UTC().Format("2006-01-02 15:04:05"))
err1 := TemplateIsActive(&Tempstatus, id, status, -1)
if err1 != nil {
return err1
}
return nil
}
/*update template isactive*/
func TemplateIsActive(template *TblEmailTemplate, id int, val int, _ int) error {
if err := DB.Table("tbl_email_templates").Where("id=? and is_deleted = 0", id).UpdateColumns(map[string]interface{}{"is_active": val, "modified_by": template.ModifiedBy, "modified_on": template.ModifiedOn}).Error; err != nil {
return err
}
return nil
}
func GetTemplates(template *TblEmailTemplate, key string, tenantid string) error {
if tenantid <= "" {
if err := DB.Debug().Table("tbl_email_templates").Where("template_slug=? and is_deleted = 0 ", key).First(&template).Error; err != nil {
return err
}
} else {
if err := DB.Debug().Table("tbl_email_templates").Where("template_slug=? and is_deleted = 0 and tenant_id=?", key, tenantid).First(&template).Error; err != nil {
return err
}
}
return nil
}
func CreateFileLog(logdata *TblImportfileLogs, tenantid string) error {
if err := DB.Debug().Table("tbl_importfile_logs").Where("tenant_id = ?", tenantid).Create(&logdata).Error; err != nil {
return err
}
return nil
}
func GetFileLogs(logdata *[]TblImportfileLogs, tenantid string) ([]TblImportfileLogs, error) {
if err := DB.Debug().Table("tbl_importfile_logs").Where("tenant_id = ?", tenantid).Select("tbl_importfile_logs.*").Order("id desc").Find(&logdata).Error; err != nil {
return *logdata, err
}
return *logdata, nil
}
func GetTemplatesByModuleId(moduleid int, tenantid string) (templates *[]TblEmailTemplate, error bool) {
fmt.Println("moduleid", moduleid)
if err := DB.Debug().Table("tbl_email_templates").Where("is_deleted = 0 and module_id=? and tenant_id=?", moduleid, tenantid).Order("id asc").Find(&templates).Error; err != nil {
return &[]TblEmailTemplate{}, false
}
return templates, true
}
+79
View File
@@ -0,0 +1,79 @@
package models
import "time"
type TblGeneralSetting struct {
Id int
CompanyName string
LogoPath string
ExpandLogoPath string
DateFormat string
TimeFormat string
TimeZone string
LanguageId int
ModifiedBy int
ModifiedOn time.Time
StorageType string
}
type TblTimeZone struct {
Id int
Timezone string
TenantId string
}
func GetGeneralSettings(tenantid string) (gensetting TblGeneralSetting, err error) {
if gerr := DB.Debug().Table("tbl_general_settings").Where("tenant_id = ?", tenantid).First(&gensetting).Error; gerr != nil {
return gensetting, gerr
}
return gensetting, nil
}
func UpdateGeneralSettings(gensetting TblGeneralSetting, tenantid string) error {
if err := DB.Debug().Table("tbl_general_settings").Where("tenant_id = ?", tenantid).UpdateColumns(map[string]interface{}{"company_name": gensetting.CompanyName, "logo_path": gensetting.LogoPath, "expand_logo_path": gensetting.ExpandLogoPath, "date_format": gensetting.DateFormat, "time_format": gensetting.TimeFormat, "time_zone": gensetting.TimeZone, "language_id": gensetting.LanguageId, "modified_by": gensetting.ModifiedBy, "modified_on": gensetting.ModifiedOn, "storage_type": gensetting.StorageType}).Error; err != nil {
return err
}
return nil
}
func UpdateLanuguageInGeneral(languageid int, tenantid string) error {
if err := DB.Table("tbl_general_settings").Where(" tenant_id = ?", tenantid).UpdateColumns(map[string]interface{}{"language_id": languageid}).Error; err != nil {
return err
}
return nil
}
func GetTimeZones(tenantid string) (timzones []TblTimeZone, err error) {
result := DB.Table("tbl_timezones").Where("tenant_id is NULL or tenant_id = ?", tenantid).Find(&timzones)
if result.Error != nil {
return nil, result.Error
}
return timzones, nil
}
func LastLoginActivity(userid, tenantid string) error {
log_time := time.Now().UTC()
if err := DB.Table("tbl_users").Where("id=? and tenant_id=?", userid, tenantid).Update("last_login", log_time).Error; err != nil {
return err
}
return nil
}
+127
View File
@@ -0,0 +1,127 @@
package models
import (
"time"
"gorm.io/gorm"
)
type TblGraphqlSettings struct {
Id int
TokenName string
Description string
Duration string
CreatedBy int
CreatedOn time.Time
ModifiedBy int `gorm:"DEFAULT:NULL"`
ModifiedOn time.Time `gorm:"DEFAULT:NULL"`
DeletedBy int `gorm:"DEFAULT:NULL"`
DeletedOn time.Time `gorm:"DEFAULT:NULL"`
IsDeleted int `gorm:"DEFAULT:0"`
Token string
IsDefault int `gorm:"DEFAULT:0"`
DateString string `gorm:"-"`
ExpiryTime time.Time
TenantId string
}
func GetListOfTokens(limit int, offset int, keyword string, tenantid string) (grpahqlsett []TblGraphqlSettings, count int64, err error) {
query := DB.Debug().Table("tbl_graphql_settings").Where("is_deleted = 0 and tenant_id = ?", tenantid)
var listQuery *gorm.DB
var countQuery *gorm.DB
if keyword != "" {
query = query.Where("lower(trim(token_name)) like lower(trim(?)) or lower(trim(description)) like lower(trim(?)) or lower(trim(duration)) like lower(trim(?))", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%")
listQuery = query.Limit(limit).Offset(offset).Order("id desc").Find(&grpahqlsett)
if listQuery.Error != nil {
return grpahqlsett, count, listQuery.Error
}
countQuery = DB.Debug().Table("tbl_graphql_settings").Where("is_deleted = 0 and tenant_id = ?", tenantid).Where("lower(trim(token_name)) like lower(trim(?)) or lower(trim(description)) like lower(trim(?)) or lower(trim(duration)) like lower(trim(?))", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%").Count(&count)
if countQuery.Error != nil {
return []TblGraphqlSettings{}, -1, countQuery.Error
}
} else {
listQuery = query.Limit(limit).Offset(offset).Order("is_default desc,id desc").Find(&grpahqlsett)
if listQuery.Error != nil {
return grpahqlsett, count, listQuery.Error
}
countQuery = DB.Table("tbl_graphql_settings").Where("is_deleted = 0 and tenant_id = ?", tenantid).Count(&count)
if countQuery.Error != nil {
return []TblGraphqlSettings{}, -1, countQuery.Error
}
}
return grpahqlsett, count, nil
}
func CreateApiToken(graphqlapi TblGraphqlSettings) error {
query := DB.Debug().Table("tbl_graphql_settings")
if graphqlapi.ExpiryTime.IsZero() {
query.Omit("expiry_time")
}
query.Create(&graphqlapi)
if err := query.Error; err != nil {
return err
}
return nil
}
func GetTokenDetailsById(id int, tenantid string) (graphql TblGraphqlSettings, err error) {
if err := DB.Table("tbl_graphql_settings").Where("id=? and tenant_id = ?", id, tenantid).First(&graphql).Error; err != nil {
return graphql, err
}
return graphql, nil
}
func UpdateApiToken(graphqlapi map[string]interface{}, id int, tenantid string) error {
query := DB.Debug().Table("tbl_graphql_settings").Where("id=? and tenant_id = ?", id, tenantid).UpdateColumns(graphqlapi)
if err := query.Error; err != nil {
return err
}
return nil
}
func DeleteApiToken(id int, deletedby int, deletedon time.Time, tenantid string) error {
if err := DB.Debug().Table("tbl_graphql_settings").Where("id=? and tenant_id = ?", id, tenantid).UpdateColumns(map[string]interface{}{"is_deleted": 1, "deleted_by": deletedby, "deleted_on": deletedon}).Error; err != nil {
return err
}
return nil
}
func MultiDeleteGraphqltoken(graph *TblGraphqlSettings, ids []int, tenantid string) error {
if err := DB.Table("tbl_graphql_settings").Where("id in (?) and tenant_id = ?", ids, tenantid).UpdateColumns(map[string]interface{}{"is_deleted": graph.IsDeleted, "deleted_by": graph.DeletedBy, "deleted_on": graph.DeletedOn}).Error; err != nil {
return err
}
return nil
}
+319
View File
@@ -0,0 +1,319 @@
package models
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"io"
"net/http"
"os"
"strings"
"time"
"github.com/stripe/stripe-go/v82"
"github.com/stripe/stripe-go/v82/checkout/session"
"gorm.io/datatypes"
"gorm.io/gorm"
)
// type TblIntegration struct {
// Id int `gorm:"primaryKey;auto_increment;type:serial"`
// ClientId string `gorm:"type:character varying"`
// ClientSecret string `gorm:"type:character varying"`
// CoverImage string `gorm:"type:character varying"`
// GatewayName string `gorm:"type:character varying"`
// GatewayDesc string `gorm:"type:character varying"`
// IsActive int `gorm:"type:integer"`
// CreatedOn time.Time `gorm:"type:timestamp without time zone"`
// CreatedBy int `gorm:"type:integer"`
// IsDeleted int `gorm:"type:integer"`
// DeletedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
// DeletedBy int `gorm:"DEFAULT:NULL"`
// ModifiedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
// ModifiedBy int `gorm:"DEFAULT:NULL"`
// TenantId string `gorm:"type:character varying"`
// }
// type TblIntegration struct {
// Id int `gorm:"primaryKey;auto_increment;type:serial"`
// ClientId string `gorm:"type:character varying"`
// ClientSecret string `gorm:"type:character varying"`
// CoverImage string `gorm:"type:character varying"`
// GatewayName string `gorm:"type:character varying"`
// GatewayDesc string `gorm:"type:character varying"`
// IsActive int `gorm:"type:integer"`
// CreatedOn time.Time `gorm:"type:timestamp without time zone"`
// CreatedBy int `gorm:"type:integer"`
// IsDeleted int `gorm:"type:integer"`
// DeletedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
// DeletedBy int `gorm:"DEFAULT:NULL"`
// ModifiedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
// ModifiedBy int `gorm:"DEFAULT:NULL"`
// TenantId string `gorm:"type:character varying"`
// }
type TblIntegration struct {
Id int `gorm:"primaryKey;auto_increment;type:serial" json:"id"`
Credentials datatypes.JSON `gorm:"type:jsonb" json:"credentials"`
IntegrationType string `gorm:"type:character varying" json:"integration_type"`
IsActive int `gorm:"type:integer" json:"is_active"`
CreatedOn time.Time `gorm:"type:timestamp without time zone" json:"created_on"`
CreatedBy int `gorm:"type:integer" json:"created_by"`
IsDeleted int `gorm:"type:integer" json:"is_deleted"`
DeletedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL" json:"deleted_on"`
DeletedBy int `gorm:"DEFAULT:NULL" json:"deleted_by"`
ModifiedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL" json:"modified_on"`
ModifiedBy int `gorm:"DEFAULT:NULL" json:"modified_by"`
TenantId string `gorm:"type:character varying" json:"tenant_id"`
}
func ListIntegration(tenantid string, Keyword string) ([]TblIntegration, int64, error) {
var Total_Integration int64
var Integration []TblIntegration
query := DB.Table("tbl_integrations").Where("tenant_id=?", tenantid).Order("id asc")
// if Keyword != "" {
// query = query.Debug().
// Where("LOWER(TRIM(tbl_integrations.gateway_name)) LIKE LOWER(TRIM(?))", "%"+Keyword+"%")
// }
query.Count(&Total_Integration).Find(&Integration)
return Integration, Total_Integration, nil
}
func EditIntegration(Id int, tenantid string) (TblIntegration, error) {
var Integration TblIntegration
if err := DB.Table("tbl_integrations").Where("id=? and tenant_id=?", Id, tenantid).First(&Integration).Error; err != nil {
return TblIntegration{}, err
}
return Integration, nil
}
func GetStripeIntegration(tenantid string) (TblIntegration, error) {
var Integration TblIntegration
if err := DB.Table("tbl_integrations").Where("tenant_id=? and is_active='1'", tenantid).Where("credentials->'credentials'->>'gateway_name' = ?", "Stripe").First(&Integration).Error; err != nil {
return TblIntegration{}, err
}
return Integration, nil
}
func ManageIntegration(integration TblIntegration, tenantId string) error {
// Prepare the individual JSON fields to update
// Example: update gateway_name and gateway_desc inside credentials JSON
credMap := map[string]interface{}{}
if err := json.Unmarshal(integration.Credentials, &credMap); err != nil {
return fmt.Errorf("failed to unmarshal credentials JSON: %w", err)
}
for key, value := range credMap {
// Convert value to JSON string
valueBytes, _ := json.Marshal(value)
if err := DB.Exec(`
UPDATE tbl_integrations
SET credentials = jsonb_set(credentials, '{credentials,"`+key+`"}', ?::jsonb, true),
modified_on = ?,
modified_by = ?
WHERE id = ? AND tenant_id = ?`,
string(valueBytes), integration.ModifiedOn, integration.ModifiedBy, integration.Id, tenantId).Error; err != nil {
return err
}
}
// Update non-JSON fields if needed
if err := DB.Table("tbl_integrations").
Where("id = ? AND tenant_id = ?", integration.Id, tenantId).
Updates(map[string]interface{}{
"integration_type": integration.IntegrationType,
"is_active": integration.IsActive,
}).Error; err != nil {
return err
}
return nil
}
func AddtoCollection(Integration TblIntegration) error {
if err := DB.Table("tbl_integrations").Create(&Integration).Error; err != nil {
return err
}
return nil
}
func CheckInterationReapt(name string, tenantid string) (bool, error) {
var integration TblIntegration
err := DB.Table("tbl_integrations").
Where("credentials->'credentials'->>'gateway_name' = ? AND tenant_id = ?", name, tenantid).Debug().
First(&integration).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return false, nil
}
return false, err
}
return true, nil
}
func StripePayment(SubscriptionName string, SubscriptionAmount int64, SuccessURL string, CancelURL string, PaymentType string, MemberId string, MemberEmail string) (string, error) {
stripe.Key = os.Getenv("Stripe_Secret_Key")
params := &stripe.CheckoutSessionParams{
LineItems: []*stripe.CheckoutSessionLineItemParams{
{
PriceData: &stripe.CheckoutSessionLineItemPriceDataParams{
Currency: stripe.String(string(stripe.CurrencyUSD)),
ProductData: &stripe.CheckoutSessionLineItemPriceDataProductDataParams{
Name: stripe.String(SubscriptionName),
},
UnitAmount: stripe.Int64(SubscriptionAmount),
},
Quantity: stripe.Int64(1),
},
},
Mode: stripe.String(string(stripe.CheckoutSessionModePayment)),
SuccessURL: stripe.String(SuccessURL),
CancelURL: stripe.String(CancelURL),
Metadata: map[string]string{
"user_id": MemberId,
"subscription": SubscriptionName,
"email": MemberEmail,
},
}
s, err := session.New(params)
if err != nil {
return "", err
}
return s.URL, nil
}
func CreatePayPalOrderAndGetApprovalLink(amount float64) (string, error) {
accessToken, _ := getAccessToken()
if accessToken == "" {
return "", fmt.Errorf("failed to get PayPal access token")
}
body := map[string]interface{}{
"intent": "CAPTURE",
"purchase_units": []map[string]interface{}{
{
"amount": map[string]string{
"currency_code": "USD",
"value": fmt.Sprintf("%.2f", amount),
},
},
},
}
jsonBody, err := json.Marshal(body)
if err != nil {
return "", fmt.Errorf("json marshal error: %w", err)
}
req, err := http.NewRequest("POST", "https://api-m.sandbox.paypal.com/v2/checkout/orders", bytes.NewBuffer(jsonBody))
if err != nil {
return "", fmt.Errorf("create request error: %w", err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+accessToken)
client := &http.Client{}
res, err := client.Do(req)
if err != nil {
return "", fmt.Errorf("paypal request error: %w", err)
}
defer res.Body.Close()
var result map[string]interface{}
if err := json.NewDecoder(res.Body).Decode(&result); err != nil {
return "", fmt.Errorf("decode error: %w", err)
}
if res.StatusCode != http.StatusCreated {
return "", fmt.Errorf("paypal create order failed: %v", result)
}
// Extract approval link
links := result["links"].([]interface{})
for _, l := range links {
link := l.(map[string]interface{})
if link["rel"] == "approve" {
return link["href"].(string), nil
}
}
return "", fmt.Errorf("approval link not found")
}
func getAccessToken() (string, error) {
clientID := os.Getenv("Access_Client")
secret := os.Getenv("Access_Secret")
if clientID == "" || secret == "" {
return "", fmt.Errorf("missing PayPal credentials in environment variables")
}
data := "grant_type=client_credentials"
req, err := http.NewRequest("POST", "https://api-m.sandbox.paypal.com/v1/oauth2/token", strings.NewReader(data))
if err != nil {
return "", fmt.Errorf("failed to create token request: %w", err)
}
req.SetBasicAuth(clientID, secret)
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
client := &http.Client{}
res, err := client.Do(req)
if err != nil {
return "", fmt.Errorf("failed to make HTTP request: %w", err)
}
defer res.Body.Close()
bodyBytes, err := io.ReadAll(res.Body)
if err != nil {
return "", fmt.Errorf("failed to read response body: %w", err)
}
if res.StatusCode != http.StatusOK {
return "", fmt.Errorf("PayPal token error [%d]: %s", res.StatusCode, string(bodyBytes))
}
var tokenData struct {
AccessToken string `json:"access_token"`
}
if err := json.Unmarshal(bodyBytes, &tokenData); err != nil {
return "", fmt.Errorf("failed to parse token JSON: %w", err)
}
if tokenData.AccessToken == "" {
return "", fmt.Errorf("access token is empty")
}
return tokenData.AccessToken, nil
}
func GetS3Credential(tenantid string, gatewayName string) (TblIntegration, error) {
var integrations TblIntegration
// JSONB query
if err := DB.Table("tbl_integrations").
Where("tenant_id = ? AND credentials->'credentials'->>'gateway_name' = ?", tenantid, gatewayName).
Order("id ASC").
First(&integrations).Error; err != nil {
return TblIntegration{}, err
}
return integrations, nil
}
+419
View File
@@ -0,0 +1,419 @@
package models
import (
"fmt"
"time"
)
type TblLanguage struct {
Id int
LanguageName string
LanguageCode string
CreatedOn time.Time
CreatedBy int
ModifiedOn time.Time `gorm:"DEFAULT:NULL"`
ModifiedBy int `gorm:"DEFAULT:NULL"`
DeletedOn time.Time `gorm:"DEFAULT:NULL"`
DeletedBy int `gorm:"DEFAULT:NULL"`
IsDeleted int `gorm:"DEFAULT:0"`
ImagePath string
IsStatus int
IsDefault int
JsonPath string
DefaultLanguageId int `gorm:"<-:false"`
DateString string `gorm:"-"`
TenantId int
StorageType string
}
type TblUser struct {
Id int `gorm:"column:id"`
Uuid string `gorm:"column:uuid"`
FirstName string `gorm:"column:first_name"`
LastName string `gorm:"column:last_name"`
RoleId int `gorm:"column:role_id"`
Email string `gorm:"column:email"`
Username string `gorm:"column:username"`
Password string `gorm:"column:password"`
MobileNo string `gorm:"column:mobile_no"`
IsActive int `gorm:"column:is_active"`
ProfileImage string `gorm:"column:profile_image"`
ProfileImagePath string `gorm:"column:profile_image_path"`
StorageType string `gorm:"column:storage_type"`
DataAccess int `gorm:"column:data_access"`
CreatedOn time.Time `gorm:"column:created_on"`
CreatedBy int `gorm:"column:created_by"`
ModifiedOn time.Time `gorm:"column:modified_on;DEFAULT:NULL"`
ModifiedBy int `gorm:"column:modified_by;DEFAULT:NULL"`
LastLogin time.Time `gorm:"column:last_login;DEFAULT:NULL"`
IsDeleted int `gorm:"column:is_deleted"`
DeletedOn time.Time `gorm:"column:deleted_on;DEFAULT:NULL"`
DeletedBy int `gorm:"column:deleted_by;DEFAULT:NULL"`
ModuleName string `gorm:"-"`
RouteName string `gorm:"-:migration;<-:false"`
DisplayName string `gorm:"-:migration;<-:false"`
Description string `gorm:"-"`
ModuleId int `gorm:"-:migration;<-:false"`
PermissionId int `gorm:"-"`
FullAccessPermission int `gorm:"-:migration;<-:false"`
RoleName string `gorm:"-:migration;<-:false"`
DefaultLanguageId int `gorm:"column:default_language_id"`
NameString string `gorm:"-"`
TenantId string
Otp int `gorm:"column:otp"`
OtpExpiry time.Time `gorm:"column:otp_expiry;DEFAULT:NULL"`
NameLength int `gorm:"-:migration;<-:false"`
LimitedLengthName string `gorm:"-:migration;<-:false"`
S3FolderName string `gorm:"column:s3_folder_name"`
Subdomain string
GoTemplateDefault int `gorm:"column:go_template_default"`
ArticleCount int `gorm:"type:integer"`
}
type QUERY struct {
UserId int
DataAccess int
}
func UpdateSubDomain(id int, subdomain string) error {
result := DB.Table("tbl_users").Where("id = ?", id).Update("subdomain", subdomain)
if result.Error != nil {
return result.Error
}
return nil
}
func GetuserBySubdomain(subdomain string) (userdetils TblUser, err error) {
if err := DB.Table("tbl_users").Where("is_deleted = 0 and subdomain = ? ", subdomain).First(&userdetils).Error; err != nil {
return TblUser{}, err
}
return userdetils, nil
}
func (q QUERY) GetLanguageList(language *[]TblLanguage, limit, offset int, filter Filter, flag bool, tenantid string) ([]TblLanguage, int64) {
var Total_languages int64
var emptyslice []TblLanguage
query := DB.Table("tbl_languages").Where("tbl_languages.is_deleted=? and tbl_languages.is_status=? ", 0, 1).Order("id desc")
if filter.Keyword != "" {
query = query.Where("(LOWER(TRIM(tbl_languages.language_name)) LIKE LOWER(TRIM(?)) OR LOWER(TRIM(tbl_languages.language_code)) LIKE LOWER(TRIM(?)))", "%"+filter.Keyword+"%", "%"+filter.Keyword+"%")
// .Or("LOWER(TRIM(tbl_languages.language_code)) ILIKE LOWER(TRIM(?)))", "%"+filter.Keyword+"%")
}
if flag {
query.Find(&language)
return *language, 0
}
if q.DataAccess == 1 {
query = query.Where("tbl_languages.created_by = ?", q.UserId)
}
if limit != 0 && !flag {
query.Offset(offset).Limit(limit).Find(&language)
return *language, 0
} else {
query.Find(&language).Count(&Total_languages)
return emptyslice, Total_languages
}
}
func GetLanguageDetails(langData *TblLanguage, langid, userid int, tenantid string) error {
var userDetails TblUser
if err := DB.Table("tbl_users").Where("id= ? and (tenant_id is NULL or tenant_id = ?)", userid, tenantid).First(&userDetails).Error; err != nil {
userDetails = TblUser{}
}
if userDetails.DefaultLanguageId == langid {
if err := DB.Debug().Table("tbl_languages").Select("tbl_languages.*,tbl_users.default_language_id").Joins("left join tbl_users on tbl_users.default_language_id = tbl_languages.Id").Where("tbl_languages.is_deleted=0 and tbl_users.is_deleted = 0 and tbl_languages.id = ? and tbl_users.id = ? and (tbl_languages.tenant_id is NULL or tbl_languages.tenant_id = ?)", langid, userid, tenantid).First(&langData).Error; err != nil {
return err
}
} else {
if err := DB.Debug().Table("tbl_languages").Where("is_deleted = 0 and id=?", langid).Where("(tenant_id is NULL or tenant_id =?)", tenantid).First(&langData).Error; err != nil {
return err
}
}
return nil
}
func AddNewLanguage(langData *TblLanguage, userid int) error {
if langData.IsDefault == 1 {
if err := DB.Debug().Table("tbl_languages").Create(&langData).Error; err != nil {
return err
}
if err := DB.Debug().Table("tbl_users").Where("is_deleted=0 and id=?", userid).Update("default_language_id", langData.Id).Error; err != nil {
return err
}
} else {
if err := DB.Debug().Table("tbl_languages").Create(&langData).Error; err != nil {
return err
}
}
return nil
}
func UpdateLanguage(langData *TblLanguage, userid int, tenantid string) error {
var default_lang TblLanguage
if langData.IsDefault == 1 {
if err := DB.Table("tbl_users").Where("is_deleted=0 and id=? and (tenant_id is NULL or tenant_id = ?)", userid, tenantid).Update("default_language_id", langData.Id).Error; err != nil {
return err
}
if err := DB.Table("tbl_languages").Where("id=? and (tenant_id is NULL or tenant_id = ?)", langData.Id, tenantid).UpdateColumns(map[string]interface{}{"language_name": langData.LanguageName, "language_code": langData.LanguageCode, "is_status": langData.IsStatus, "image_path": langData.ImagePath, "modified_on": langData.ModifiedOn, "modified_by": langData.ModifiedBy, "storage_type": langData.StorageType}).Error; err != nil {
return err
}
} else {
err := GetDefaultLanguage(&default_lang, userid, tenantid)
if err != nil {
return err
}
if default_lang.Id != langData.Id {
if err := DB.Table("tbl_languages").Where("id=? and (tenant_id is NULL or tenant_id = ?)", langData.Id, tenantid).UpdateColumns(map[string]interface{}{"language_name": langData.LanguageName, "language_code": langData.LanguageCode, "is_status": langData.IsStatus, "image_path": langData.ImagePath, "modified_on": langData.ModifiedOn, "modified_by": langData.ModifiedBy, "storage_type": langData.StorageType}).Error; err != nil {
return err
}
} else {
if err := DB.Table("tbl_languages").Where("id=? and (tenant_id is NULL or tenant_id = ?)", langData.Id, tenantid).UpdateColumns(map[string]interface{}{"language_name": langData.LanguageName, "language_code": langData.LanguageCode, "is_status": langData.IsStatus, "image_path": langData.ImagePath, "modified_on": langData.ModifiedOn, "modified_by": langData.ModifiedBy, "storage_type": langData.StorageType}).Error; err != nil {
return err
}
MakeDefaultLanguage(userid, tenantid)
}
}
return nil
}
func DeleteLanguage(langData *TblLanguage, tenantid string) error {
if err := DB.Table("tbl_languages").Where("id=? and (tenant_id is NULL or tenant_id = ?)", langData.Id, tenantid).UpdateColumns(map[string]interface{}{"is_deleted": langData.IsDeleted, "deleted_by": langData.DeletedBy, "deleted_on": langData.DeletedOn}).Error; err != nil {
return err
}
return nil
}
func FetchAllLanguage(languages *[]TblLanguage, tenantid string) error {
if err := DB.Table("tbl_languages").Where("is_deleted=0 and (tenant_id is NULL or tenant_id = ?)", tenantid).Order("id desc").Find(&languages).Error; err != nil {
return err
}
return nil
}
func GetDefaultLanguage(default_lang *TblLanguage, userid int, tenantid string) error {
if err := DB.Table("tbl_languages").Select("tbl_languages.*").Joins("inner join tbl_users on tbl_users.default_language_id = tbl_languages.id").Where("tbl_languages.is_deleted=0 and tbl_users.id=? and (tbl_languages.tenant_id is NULL or tbl_languages.tenant_id = ?)", userid, tenantid).First(&default_lang).Error; err != nil {
return err
}
return nil
}
func GetLanguagebyLanguagecode(langData *TblLanguage, langCode string, tenantid string) error {
if err := DB.Table("tbl_languages").Where("is_deleted = 0 and language_code=? and (tenant_id is NULL or tenant_id = ?)", langCode, tenantid).First(&langData).Error; err != nil {
return err
}
return nil
}
func MakeDefaultLanguage(userid int, tenantid string) error {
var AutoDefaultLanguage TblLanguage
if err := DB.Table("tbl_languages").Where("is_deleted = 0 and language_code='en' and (tenant_id is NULL or tenant_id = ?)", tenantid).First(&AutoDefaultLanguage).Error; err != nil {
return err
}
// if err := db.Table("tbl_languages").Where("is_deleted = 0 and language_code='en'").Update("is_default", 1).Error; err != nil {
// return err
// }
if err := DB.Table("tbl_users").Where("is_deleted=0 and id=? and (tenant_id is NULL or tenant_id = ?)", userid, tenantid).Update("default_language_id", AutoDefaultLanguage.Id).Error; err != nil {
return err
}
return nil
}
func EliminateDefaultMany(tenantid string) error {
if err := DB.Table("tbl_languages").Where("is_deleted=0 and is_default=1 and language_code!=? and (tenant_id is NULL or tenant_id = ?)", "en", tenantid).Update("is_default", 0).Error; err != nil {
return err
}
return nil
}
func Checklang(language *TblLanguage, language_name string, langid int, tenantid string) error {
if langid == 0 {
if err := DB.Table("tbl_languages").Where("LOWER(TRIM(language_name))=LOWER(TRIM(?)) and is_deleted = 0 and (tenant_id is NULL or tenant_id = ?)", language_name, tenantid).First(&language).Error; err != nil {
return err
}
} else {
if err := DB.Table("tbl_languages").Where("LOWER(TRIM(language_name))=LOWER(TRIM(?)) and id not in(?) and is_deleted= 0 and (tenant_id is NULL or tenant_id = ?)", language_name, langid, tenantid).First(&language).Error; err != nil {
return err
}
}
return nil
}
func GetIdByLanguageName(langData *TblLanguage, LangName string, tenantid string) error {
if err := DB.Table("tbl_languages").Where("is_deleted = 0 and language_name=? and (tenant_id is NULL or tenant_id = ?)", LangName, tenantid).First(&langData).Error; err != nil {
return err
}
return nil
}
func GetLanguageById(langData *TblLanguage, id int) error {
if err := DB.Table("tbl_languages").Where("is_deleted =0 and id =?", id).First(&langData).Error; err != nil {
return err
}
return nil
}
func Languageisactive(langData *TblLanguage, id, tenantid string) error {
if err := DB.Table("tbl_languages").Where("id=? and (tenant_id is NULL or tenant_id = ?)", id, tenantid).UpdateColumns(map[string]interface{}{"is_status": langData.IsStatus, "modified_by": langData.ModifiedBy, "modified_on": langData.ModifiedOn}).Error; err != nil {
return err
}
return nil
}
func RemoveLanguageImagePath(ImagePath string, tenantid string) error {
if err := DB.Table("tbl_languages").Where("image_path=? and (tenant_id is NULL or tenant_id = ?)", ImagePath, tenantid).UpdateColumns(map[string]interface{}{"image_path": ""}).Error; err != nil {
return err
}
return nil
}
func MultiSelectDeleteLanguage(langData *TblLanguage, languageid []int, tenantid string) error {
if err := DB.Table("tbl_languages").Where("id in (?) and (tenant_id is NULL or tenant_id = ?)", languageid, tenantid).UpdateColumns(map[string]interface{}{"is_deleted": langData.IsDeleted, "deleted_by": langData.DeletedBy, "deleted_on": langData.DeletedOn}).Error; err != nil {
return err
}
return nil
}
func MultiSelectLanguageisactive(langData *TblLanguage, id []int, tenantid string) error {
if err := DB.Table("tbl_languages").Where("id in (?) and (tenant_id is NULL or tenant_id = ?)", id, tenantid).UpdateColumns(map[string]interface{}{"is_status": langData.IsStatus, "modified_by": langData.ModifiedBy, "modified_on": langData.ModifiedOn}).Error; err != nil {
return err
}
return nil
}
func SetDefaultLang(langId, defaultVal int, tenantId string) (language TblLanguage, err error) {
fmt.Println("Seumm")
if defaultVal != 1 {
if err := DB.Table("tbl_users").Where("is_deleted=0 and is_active = 1 and (tenant_id is NULL or tenant_id = ?)", tenantId).Update("default_language_id", langId).Error; err != nil {
return TblLanguage{}, err
}
if err := DB.Table("tbl_languages").Where("is_deleted = 0 and id= ? ", langId).Update("is_default", 1).Error; err != nil {
return TblLanguage{}, err
}
if err := DB.Table("tbl_languages").Where("is_deleted = 0 and id != ? ", langId).Update("is_default", 0).Error; err != nil {
return TblLanguage{}, err
}
if err := DB.Table("tbl_languages").Where("is_deleted = 0 and id = ? ", langId).First(&language).Error; err != nil {
return TblLanguage{}, err
}
}
return language, nil
}
+67
View File
@@ -0,0 +1,67 @@
package models
import "gorm.io/datatypes"
type TblStorageType struct {
Id int
Local string
Aws datatypes.JSONMap `gorm:"type:jsonb"`
Azure datatypes.JSONMap `gorm:"type:jsonb"`
Drive datatypes.JSONMap `gorm:"type:jsonb"`
SelectedType string
}
type AWS struct {
AccessId string `json:"accessid"`
AccessKey string `json:"accesskey"`
Region string `json:"region"`
BucketName string `json:"bucketname"`
}
type Azure struct {
StorageAccount string `json:"storageaccount"`
AccountKey string `json:"accountkey"`
ContainerName string `json:"containername"`
}
func UpdateStorageType(stype TblStorageType, _ string) (TblStorageType, error) {
query := DB.Debug().Model(TblStorageType{}).Where("id=1")
if stype.SelectedType == "local" {
query = query.Omit("aws,azure,drive")
} else if stype.SelectedType == "aws" {
query = query.Omit("local,azure,drive")
} else if stype.SelectedType == "azure" {
query = query.Omit("aws,local,drive")
} else if stype.SelectedType == "drive" {
query = query.Omit("aws,azure,local")
}
query = query.UpdateColumns(map[string]interface{}{"local": stype.Local, "aws": stype.Aws, "azure": stype.Azure, "drive": stype.Drive, "selected_type": stype.SelectedType})
if err := query.Error; err != nil {
return TblStorageType{}, err
}
return stype, nil
}
func GetStorageValue(_ string) (tblstorgetype TblStorageType, err error) {
if err := DB.Model(TblStorageType{}).Where("id=1").First(&tblstorgetype).Error; err != nil {
return TblStorageType{}, err
}
return tblstorgetype, nil
}
+34
View File
@@ -0,0 +1,34 @@
package models
import (
"time"
)
type TblMemberSetting struct {
Id int
AllowRegistration int
MemberLogin string
ModifiedOn time.Time `gorm:"DEFAULT:NULL"`
ModifiedBy int `gorm:"DEFAULT:NULL"`
NotificationUsers string
}
func GetMemberSettings(tenantid string) (membersetting *[]TblMemberSetting, error bool) {
if err := DB.Where("tenant_id = ?", tenantid).Table("tbl_member_settings").Find(&membersetting).Error; err != nil {
return &[]TblMemberSetting{}, false
}
return membersetting, true
}
func UpdateMemberSetting(membersetting *TblMemberSetting, tenantid string) error {
if err := DB.Model(TblMemberSetting{}).Where("id=? and tenant_id = ?", membersetting.Id, tenantid).UpdateColumns(map[string]interface{}{"allow_registration": membersetting.AllowRegistration, "member_login": membersetting.MemberLogin, "notification_users": membersetting.NotificationUsers, "modified_on": membersetting.ModifiedOn, "modified_by": membersetting.ModifiedBy}).Error; err != nil {
return err
}
return nil
}
+132
View File
@@ -0,0 +1,132 @@
package models
import (
"os"
"time"
"github.com/dgrijalva/jwt-go"
"golang.org/x/crypto/bcrypt"
)
type TblMembers struct {
Id int `gorm:"primaryKey;auto_increment;type:serial"`
Uuid string `gorm:"type:character varying"`
FirstName string `gorm:"type:character varying"`
LastName string `gorm:"type:character varying"`
Email string `gorm:"type:character varying"`
MobileNo string `gorm:"type:character varying"`
IsActive int `gorm:"type:integer"`
ProfileImage string `gorm:"type:character varying"`
ProfileImagePath string `gorm:"type:character varying"`
LastLogin int `gorm:"type:integer"`
MemberGroupId int `gorm:"type:integer"`
Password string `gorm:"type:character varying"`
Username string `gorm:"DEFAULT:NULL"`
Otp int `gorm:"DEFAULT:NULL"`
OtpExpiry time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
LoginTime time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
IsDeleted int `gorm:"type:integer"`
DeletedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
DeletedBy int `gorm:"DEFAULT:NULL"`
CreatedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
CreatedBy int `gorm:"type:integer"`
ModifiedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
ModifiedBy int `gorm:"DEFAULT:NULL"`
StorageType string `gorm:"type:character varying"`
TenantId string `gorm:"type:character varying"`
}
func GetMemberByEmail(email string, tenantid string) (member TblMembers, err error) {
query := DB.Table("tbl_members").Where("is_deleted = 0 AND email = ?", email)
if tenantid != "" {
query = query.Where("tenant_id = ?", tenantid)
}
if err := query.First(&member).Error; err != nil {
return TblMembers{}, err
}
return member, nil
}
func GetMemberById(id int, tenantid string) (member TblMembers, err error) {
query := DB.Table("tbl_members").Where("is_deleted = 0 AND id = ?", id)
if tenantid != "" {
query = query.Where("tenant_id = ?", tenantid)
}
if err := query.First(&member).Error; err != nil {
return TblMembers{}, err
}
return member, nil
}
func CreateMember(members *TblMembers) (member TblMembers, err error) {
if err := DB.Table("tbl_members").Create(&members).Error; err != nil {
return TblMembers{}, err
}
return *members, nil
}
func UpdateMemberOtp(member TblMembers, tenantid string) error {
result := DB.Table("tbl_members").Where("id = ? and tenant_id=?", member.Id, member.TenantId).UpdateColumns(map[string]interface{}{"modified_on": member.ModifiedOn, "modified_by": member.Id, "otp": member.Otp, "otp_expiry": member.OtpExpiry})
if result.Error != nil {
return result.Error
}
return nil
}
func CheckMemberLogin(Email string, Password string, userid int, tenantid string) (string, bool, bool, error) {
var members TblMembers
err := DB.Table("tbl_members").Where("tbl_members.is_deleted = 0 AND tbl_members.email = ? AND tbl_members.created_by = ? AND tbl_members.tenant_id = ?", Email, userid, tenantid).First(&members).Error
if err != nil {
return "", false, false, err
}
if members.Email == "" {
return "", false, false, err
}
passerr := bcrypt.CompareHashAndPassword([]byte(members.Password), []byte(Password))
if passerr != nil || passerr == bcrypt.ErrMismatchedHashAndPassword {
return "", false, true, passerr
}
token, err := CreateToken(members)
if err != nil {
return "", false, true, err
}
return token, true, true, nil
}
func CreateToken(members TblMembers) (string, error) {
atClaims := jwt.MapClaims{}
atClaims["member_id"] = members.Id
atClaims["user_id"] = members.CreatedBy
atClaims["tenant_id"] = members.TenantId
token := jwt.NewWithClaims(jwt.SigningMethodHS256, atClaims)
return token.SignedString([]byte(os.Getenv("JWT_SECRET")))
}
+47
View File
@@ -0,0 +1,47 @@
package models
import "time"
type TblUserPersonalize struct {
Id int
UserId int
MenuBackgroundColor string
FontColor string
IconColor string
LogoPath string
ExpandLogoPath string
CreatedOn time.Time
ModifiedOn time.Time `gorm:"default:null"`
TenantId string
}
func GetPersonalize(personalize *TblUserPersonalize, id int, tenantid string) error {
if err := DB.Table("tbl_user_personalizes").Select("tbl_user_personalizes.*").Where("user_id=? and tenant_id = ?", id, tenantid).First(&personalize).Error; err != nil {
return err
}
return nil
}
func CreatePersonalize(personalize *TblUserPersonalize) error {
if err := DB.Table("tbl_user_personalizes").Create(&personalize).Error; err != nil {
return err
}
return nil
}
func UpdatePersonalize(personalize *TblUserPersonalize, id int, tenantid string) error {
if err := DB.Table("tbl_user_personalizes").Where("user_id=? and tenant_id=?", id, tenantid).UpdateColumns(map[string]interface{}{"menu_background_color": personalize.MenuBackgroundColor, "logo_path": personalize.LogoPath, "expand_logo_path": personalize.ExpandLogoPath, "modified_on": personalize.ModifiedOn}).Error; err != nil {
return err
}
return nil
}
+178
View File
@@ -0,0 +1,178 @@
package models
import (
"fmt"
"time"
)
type TblBlock struct {
Id int `gorm:"primaryKey;auto_increment;type:serial"`
Title string `gorm:"type:character varying"`
BlockDescription string `gorm:"type:text"`
BlockContent string `gorm:"type:text"`
BlockCss string `gorm:"type:text"`
CoverImage string `gorm:"type:character varying"`
IconImage string `gorm:"type:character varying"`
TenantId int `gorm:"type:integer"`
Prime int `gorm:"type:integer"`
IsActive int `gorm:"type:integer"`
CreatedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
CreatedBy int `gorm:"type:integer"`
ModifiedBy int `gorm:"type:integer"`
ModifiedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
DeletedOn time.Time `gorm:"type:timestamp without time zone;DEFAULT:NULL"`
DeletedBy int `gorm:"type:integer;DEFAULT:NULL"`
IsDeleted int `gorm:"type:integer;DEFAULT:0"`
ProfileImagePath string `gorm:"<-:false"`
FirstName string `gorm:"<-:false"`
LastName string `gorm:"<-:false"`
Username string `gorm:"<-:false"`
TagValueArr []string `gorm:"-"`
TagValue string `gorm:"<-:false;"`
NameString string `gorm:"-"`
Actions string `gorm:"<-:false"`
CreatedDate string `gorm:"-:migration;<-:false"`
ModifiedDate string `gorm:"-:migration;<-:false"`
}
type TblTemplates struct {
Id int
TemplateName string
TemplateSlug string
TemplateModuleId int
ImageName string
ImagePath string
DeployLink string
GithubLink string
CreatedOn time.Time
CreatedBy int
IsActive int `gorm:"DEFAULT:1"`
IsDeleted int `gorm:"DEFAULT:0"`
DeletedOn time.Time `gorm:"DEFAULT:NULL"`
DeletedBy int `gorm:"DEFAULT:NULL"`
ModifiedOn time.Time `gorm:"DEFAULT:NULL"`
ModifiedBy int `gorm:"DEFAULT:NULL"`
TenantId int
Preview string `gorm:"type:character varying"`
}
type TblTemplateModules struct {
Id int
TemplateModuleName string
TemplateModuleSlug string
Description string
IsActive int
CreatedOn time.Time
CreatedBy int
TenantId int
Templates []TblTemplates `gorm:"foreignKey:TemplateModuleId"`
TemplateCount int `gorm:"-"`
ChannelId int
}
type TblChannel struct {
Id int
ChannelName string
ChannelDescription string
SlugName string
FieldGroupId int
IsActive int
IsDeleted int
CreatedBy int
ModifiedOn time.Time `gorm:"DEFAULT:NULL"`
ModifiedBy int `gorm:"DEFAULT:NULL"`
DateString string
EntriesCount int
ProfileImagePath string `gorm:"-;<-:false"`
ChannelType string
TenantId int
TemplatesCount int `gorm:"-"`
}
func GetTemplateModuleList(keyword string, tenantId string, channelSlug string) (tempModuleList []TblTemplateModules, count int64, err error) {
query := DB.Debug().Preload("Templates", "is_active = 1 and is_deleted = 0 and lower(trim(template_name)) like lower(trim(?)) ", "%"+keyword+"%")
if channelSlug != "" {
query = query.Where("is_active = 1 and tenant_id is Null and slug_name=?", channelSlug)
fmt.Println("channelSlug:", query)
} else {
query = query.Where("is_active = 1 and tenant_id is Null")
}
listQuery := query.Find(&tempModuleList)
if listQuery.Error != nil {
return []TblTemplateModules{}, -1, listQuery.Error
}
countQuery := query.Count(&count)
if countQuery.Error != nil {
return []TblTemplateModules{}, -1, countQuery.Error
}
fmt.Println("tempModuleList:", tempModuleList)
return tempModuleList, count, nil
}
type TemplatesCount struct {
SlugName string
TemplateCount int
}
func GetChannelBasedTemplateCount(slugName string, tenantId string) (templatesCount TemplatesCount, err error) {
var count TemplatesCount
query := DB.Debug().Table("tbl_templates").Select("count(id) as template_count, slug_name").Where("is_deleted = 0 AND is_active = 1 AND tenant_id is Null and slug_name = ?", slugName)
err = query.Group("slug_name").Find(&count).Error
if err != nil {
return TemplatesCount{}, err
}
return count, nil
}
func GetChannelDetailsWithTemplateCount(channelSlug string, tenantId string) (channelDetails TblChannel, err error) {
query := DB.Debug().Where("is_deleted = 0 and is_active = 1 and tenant_id = ? and slug_name = ? ", tenantId, channelSlug).First(&channelDetails)
if query.Error != nil {
return TblChannel{}, query.Error
}
templateCount, err := GetChannelBasedTemplateCount(channelSlug, tenantId)
if query.Error != nil {
return TblChannel{}, query.Error
}
channelDetails.EntriesCount = templateCount.TemplateCount
return channelDetails, err
}
func BlockLists(limit, offset int, filter Filter, tenantid string) (block []TblBlock, Totalblock int64, err error) {
query := DB.Select("tbl_blocks.*,max(tbl_users.first_name) as first_name,max(tbl_users.last_name) as last_name, max(tbl_users.profile_image_path) as profile_image_path, max(tbl_users.username) as username, STRING_AGG(tbl_block_tags.tag_name, ', ') as tag_value ,(case when (select id from tbl_block_collections where tbl_block_collections.block_id = tbl_blocks.id and is_deleted = 0 limit 1) is not null then 'true' else 'false' end ) as actions ").Table("tbl_blocks").Joins("inner join tbl_block_tags on tbl_block_tags.block_id = tbl_blocks.id").Joins("left join tbl_block_collections on tbl_block_collections.block_id = tbl_blocks.id").Joins("inner join tbl_users on case when tbl_block_collections.id is not null then tbl_users.id = tbl_block_collections.user_id else tbl_users.id = tbl_blocks.created_by end").Where("tbl_blocks.is_deleted = ? and tbl_blocks.tenant_id =?", 0, tenantid).Group("tbl_blocks.id").Order("tbl_blocks.id desc")
if filter.Keyword != "" {
query = query.Where("LOWER(TRIM(tbl_blocks.title)) LIKE LOWER(TRIM(?)) ", "%"+filter.Keyword+"%")
}
if limit != 0 {
query.Limit(limit).Offset(offset).Find(&block)
return block, 0, err
}
query.Find(&block).Count(&Totalblock)
return block, Totalblock, err
}
+227
View File
@@ -0,0 +1,227 @@
package models
import (
"encoding/json"
"time"
"gorm.io/gorm"
)
type Payload string
type Method string
type TblWebhooks struct {
Id int
WebhookName string
PayloadType Payload `gorm:"DEFAULT:NULL"`
RequestMethod Method
RequestUrl string
EventType string
IsActive int
Headers json.RawMessage `gorm:"DEFAULT:NULL"`
Fields json.RawMessage `gorm:"DEFAULT:NULL"`
TenantId string
CreatedBy int
CreatedOn time.Time
ModifiedBy int `gorm:"DEFAULT:NULL"`
ModifiedOn time.Time `gorm:"DEFAULT:NULL"`
IsDeleted int `gorm:"DEFAULT:0"`
DeletedBy int `gorm:"DEFAULT:NULL"`
DeletedOn time.Time `gorm:"DEFAULT:NULL"`
ParseHeaders interface{} `gorm:"-"`
}
type WebhookFilter struct {
Id int
Limit int
Offset int
Keyword string
Title string
EventType string
IsActive int
Order int
Sort string
TenantId string
List bool
FetchOne bool
Count bool
}
func CreateWebhook(webhook *TblWebhooks) error {
if err := DB.Create(&webhook).Error; err != nil {
return err
}
return nil
}
func (wf WebhookFilter) FetchWebhook(webhooks *[]TblWebhooks, webhook *TblWebhooks, count *int64) error {
query := DB.Debug().Model(TblWebhooks{}).Where("is_deleted=0")
if wf.Id != 0 {
query = query.Where("id=?", wf.Id)
}
if wf.TenantId > "" {
query = query.Where("tenant_id=?", wf.TenantId)
}
if wf.IsActive > -1 {
query = query.Where("is_active=?", wf.IsActive)
}
if wf.Keyword != "" {
query = query.Where("TRIM(LOWER(webhook_name)) LIKE TRIM(LOWER(?))", "%"+wf.Keyword+"%")
}
if wf.EventType!=""{
query = query.Where("event_type=?",wf.EventType)
}
if wf.Title != "" {
query = query.Where("webhook_name=?", wf.Title)
}
if wf.FetchOne {
if err := query.First(&webhook).Error; err != nil {
return err
}
}
if wf.Count {
if err := query.Count(count).Error; err != nil {
return err
}
}
if wf.List {
if wf.Sort != "" {
var order string
if wf.Order == 1 {
order = wf.Sort + " desc"
} else {
order = wf.Sort
}
query = query.Order(order)
} else {
query = query.Order("id desc")
}
if wf.Limit > 0 {
query = query.Limit(wf.Limit)
}
if wf.Offset > -1 {
query = query.Offset(wf.Offset)
}
if err := query.Find(&webhooks).Error; err != nil {
return err
}
}
return nil
}
func UpdateWebhook(webhook *TblWebhooks) error {
// tx := DB.Begin()
// if err := tx.Error; err != nil {
// return err
// }
// if err := tx.Debug().Where("is_deleted=0 and tenant_id=?", webhook.TenantId).Updates(webhook).Error; err != nil {
// tx.Rollback()
// return err
// }
// if err := tx.Where("is_deleted=0 and id=? and tenant_id=?",webhook.Id,webhook.TenantId).First(&webhook).Error; err != nil {
// tx.Rollback()
// return err
// }
// if err := tx.Commit().Error; err != nil {
// tx.Rollback()
// return err
// }
pipeline := func(tx *gorm.DB) error {
switch {
case webhook.IsActive == 0 || webhook.PayloadType == "":
mapData := map[string]interface{}{"id": webhook.Id, "webhook_name": webhook.WebhookName, "payload_type": webhook.PayloadType, "request_method": webhook.RequestMethod, "request_url": webhook.RequestUrl, "event_type": webhook.EventType, "is_active": webhook.IsActive, "tenant_id": webhook.TenantId, "modified_on": webhook.ModifiedOn, "modified_by": webhook.ModifiedBy, "headers": webhook.Headers, "fields": webhook.Fields}
if err := tx.Model(TblWebhooks{}).Where("is_deleted=0 and id=? and tenant_id=?", webhook.Id, webhook.TenantId).UpdateColumns(mapData).Error; err != nil {
return err
}
default:
if err := tx.Where("is_deleted=0 and tenant_id=?", webhook.TenantId).Updates(webhook).Error; err != nil {
return err
}
}
if err := tx.Where("is_deleted=0 and tenant_id=?", webhook.TenantId).First(&webhook).Error; err != nil {
return err
}
return nil
}
if err := DB.Debug().Transaction(pipeline); err != nil {
return err
}
return nil
}
func DeleteWebhook(webhook TblWebhooks) error {
if err := DB.Debug().Where("is_deleted=0 and tenant_id=?", webhook.TenantId).Updates(webhook).Error; err != nil {
return err
}
return nil
}
+105
View File
@@ -0,0 +1,105 @@
package controller
import (
"fmt"
"html/template"
"os"
"spurt-cms/controllers"
"strconv"
"strings"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
forms "github.com/spurtcms/forms-builders"
)
func PageView(c *gin.Context) {
uuid := c.Param("slugstring")
arr := strings.Split(uuid, "-")
entries, _, err := controllers.ChannelConfigWP.EntryPreview(arr[len(arr)-1])
if err != nil {
controllers.ErrorLog.Printf("preview details api error: %s", err)
}
content := template.HTML(entries.Description)
formdata, err := controllers.FormConfig.GetCtaById(entries.CtaId)
newpath := os.Getenv("BASE_URL")
if err != nil {
controllers.ErrorLog.Printf("preview details api error: %s", err)
}
viewurl := os.Getenv("VIEW_BASE_URL") + "/cta/formresponse"
c.HTML(200, "page-view.html", gin.H{"Entries": content, "Entry": entries, "URL": viewurl, "FormData": formdata.FormData, "FormId": formdata.Id, "Formtitle": formdata.FormTitle, "Userid": formdata.CreatedBy, "uploadurl": newpath})
}
func FormsView(c *gin.Context) {
uuid := c.Param("id")
viewurl := os.Getenv("VIEW_BASE_URL") + "/cta/formresponse"
arr := strings.Split(uuid, "-")
Forms, err := controllers.FormConfig.FormPreview(arr[len(arr)-1])
newpath := os.Getenv("BASE_URL")
if err != nil {
controllers.ErrorLog.Printf("preview details api error: %s", err)
}
c.HTML(200, "formpreview.html", gin.H{"FormData": Forms.FormData, "URL": viewurl, "FormId": Forms.Id, "Formtitle": Forms.FormTitle, "Userid": Forms.CreatedBy, "uploadurl": newpath})
}
func FormResponse(c *gin.Context) {
data := c.PostForm("data")
Id := c.PostForm("Id")
userid := c.PostForm("UserId")
fmt.Println("useriduserid:", userid)
entryidForm := c.PostForm("EntryId")
entryidQuery := c.Query("id")
id, _ := strconv.Atoi(Id)
Userid, _ := strconv.Atoi(userid)
nameValue := c.PostForm("nameValue")
var Entryid int
var err error
fmt.Println("entidform", entryidForm)
if entryidQuery != "" {
Entryid, err = strconv.Atoi(entryidQuery)
if err != nil {
fmt.Println(err)
}
} else {
Entryid, err = strconv.Atoi(entryidForm)
if err != nil {
fmt.Println(err)
}
}
uuid := (uuid.New()).String()
arr := strings.Split(uuid, "-")
ticket := "TKT-" + arr[len(arr)-1]
response := forms.TblFormResponse{
FormId: id,
FormResponse: data,
UserId: Userid,
TenantId: controllers.TenantId,
Name: nameValue,
Ticket: ticket,
EntryId: Entryid,
}
err1 := controllers.FormConfig.CreateFormResponse(response)
if err1 != nil {
fmt.Println(err)
}
c.JSON(200, gin.H{"status": 1, "message": "form submitted successfully"})
}
func FileNotFound(c *gin.Context) {
c.HTML(200, "404pageview.html", gin.H{"page not found": true})
}
+11
View File
@@ -0,0 +1,11 @@
package middleware
import "github.com/gin-gonic/gin"
func TemplateViewAuth() gin.HandlerFunc{
return func(c *gin.Context) {
c.Next()
}
}
+43
View File
@@ -0,0 +1,43 @@
package pageview
import (
"os"
viewcontroller "spurt-cms/page-view/controller"
"spurt-cms/page-view/middleware"
"sync"
"github.com/gin-gonic/gin"
)
func RunTemplateView(wg *sync.WaitGroup) {
defer wg.Done()
r := gin.Default()
r.Use(middleware.TemplateViewAuth())
r.Static("/public", "./public")
r.LoadHTMLGlob("view/**/*.html")
r.GET("/:dynamicString/*slugstring", viewcontroller.PageView)
r.GET("/forms/:id", viewcontroller.FormsView)
r.POST("/cta/formresponse", viewcontroller.FormResponse)
r.GET("/404-pageview", viewcontroller.FileNotFound)
r.NoRoute(func(ctx *gin.Context) {
ctx.Redirect(301, os.Getenv("VIEW_BASE_URL")+"/404-pageview")
})
err := r.Run(":" + os.Getenv("VIEW_PORT"))
if err != nil {
panic(err)
}
}
+5
View File
@@ -0,0 +1,5 @@
<svg width="18" height="16" viewBox="0 0 18 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.7998 8.20312H5.80698M8.99625 8.20312H9.00337M12.1927 8.20312H12.1998" stroke="#717171" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M13.7998 15.4C14.7856 15.4 15.5846 14.479 15.5846 13.3429C15.5846 11.5447 15.5048 10.3491 16.7384 8.9273C17.0869 8.52562 17.0869 7.87434 16.7384 7.47266C15.5048 6.05084 15.5846 4.85533 15.5846 3.05714C15.5846 1.92102 14.7856 1 13.7998 1" stroke="#717171" stroke-width="1.1" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M4.2 15.4C3.21427 15.4 2.41518 14.479 2.41518 13.3429C2.41518 11.5447 2.49502 10.3491 1.26138 8.9273C0.912872 8.52562 0.912872 7.87434 1.26138 7.47266C2.46797 6.08201 2.41518 4.87194 2.41518 3.05714C2.41518 1.92102 3.21427 1 4.2 1" stroke="#717171" stroke-width="1.1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 928 B

+5
View File
@@ -0,0 +1,5 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14 6.01818C14.2761 6.01818 14.5 5.79021 14.5 5.50909C14.5 5.22797 14.2761 5 14 5H10C9.7239 5 9.5 5.22797 9.5 5.50909C9.5 5.79021 9.7239 6.01818 10 6.01818H14Z" fill="white"/>
<path d="M6.5 6.52734C6.2239 6.52734 6 6.75531 6 7.03643C6 7.31755 6.2239 7.54553 6.5 7.54553H7V16.9128C7 18.0633 7.92 19.0001 9.05 19.0001H14.95C16.0799 19.0001 17 18.0633 17 16.9128V7.54553H17.5C17.7761 7.54553 18 7.31755 18 7.03643C18 6.75531 17.7761 6.52734 17.5 6.52734H16.5H7.5H6.5ZM16 7.54553V16.9128C16 17.5033 15.53 17.9819 14.95 17.9819H9.05C8.47 17.9819 8 17.5033 8 16.9128V7.54553H16Z" fill="white"/>
<circle cx="12" cy="12" r="11.5" stroke="white"/>
</svg>

After

Width:  |  Height:  |  Size: 751 B

+3
View File
@@ -0,0 +1,3 @@
<svg width="10" height="7" viewBox="0 0 10 7" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5 7L10 0.0717955H0L5 7Z" fill="#262626"/>
</svg>

After

Width:  |  Height:  |  Size: 153 B

+4
View File
@@ -0,0 +1,4 @@
<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5 10C4.8705 10 4.7463 9.94856 4.65473 9.85699C4.56316 9.76542 4.51172 9.64122 4.51172 9.51172V0.488281C4.51172 0.358781 4.56316 0.234585 4.65473 0.143014C4.7463 0.0514438 4.8705 0 5 0C5.1295 0 5.2537 0.0514438 5.34527 0.143014C5.43684 0.234585 5.48828 0.358781 5.48828 0.488281V9.51172C5.48828 9.64122 5.43684 9.76542 5.34527 9.85699C5.2537 9.94856 5.1295 10 5 10Z" fill="#252525"/>
<path d="M9.51172 5.48828H0.488281C0.358781 5.48828 0.234585 5.43684 0.143014 5.34527C0.0514438 5.2537 0 5.1295 0 5C0 4.8705 0.0514438 4.7463 0.143014 4.65473C0.234585 4.56316 0.358781 4.51172 0.488281 4.51172H9.51172C9.64122 4.51172 9.76542 4.56316 9.85699 4.65473C9.94856 4.7463 10 4.8705 10 5C10 5.1295 9.94856 5.2537 9.85699 5.34527C9.76542 5.43684 9.64122 5.48828 9.51172 5.48828Z" fill="#252525"/>
</svg>

After

Width:  |  Height:  |  Size: 904 B

+5
View File
@@ -0,0 +1,5 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15.342 24H8.64729C2.58861 24 0 21.4102 0 15.3488V8.65116C0 2.58977 2.58861 0 8.64729 0H15.342C21.4007 0 23.9893 2.58977 23.9893 8.65116V15.3488C23.9893 21.4102 21.4007 24 15.342 24ZM8.64729 1.67442C3.50355 1.67442 1.67367 3.50512 1.67367 8.65116V15.3488C1.67367 20.4949 3.50355 22.3256 8.64729 22.3256H15.342C20.4857 22.3256 22.3156 20.4949 22.3156 15.3488V8.65116C22.3156 3.50512 20.4857 1.67442 15.342 1.67442H8.64729Z" fill="#C0C0C0"/>
<path d="M8.6475 10.6044C6.95151 10.6044 5.5791 9.23136 5.5791 7.53461C5.5791 5.83787 6.95151 4.46484 8.6475 4.46484C10.3435 4.46484 11.7159 5.83787 11.7159 7.53461C11.7159 9.23136 10.3435 10.6044 8.6475 10.6044ZM8.6475 6.13926C7.87761 6.13926 7.25277 6.76438 7.25277 7.53461C7.25277 8.30484 7.87761 8.92996 8.6475 8.92996C9.41738 8.92996 10.0422 8.30484 10.0422 7.53461C10.0422 6.76438 9.41738 6.13926 8.6475 6.13926Z" fill="#C0C0C0"/>
<path d="M1.58389 20.5955C1.3161 20.5955 1.04831 20.4616 0.892103 20.2271C0.635474 19.8476 0.735894 19.3229 1.12642 19.0662L6.62721 15.3713C7.83225 14.5564 9.49477 14.6569 10.5883 15.5834L10.9565 15.9071C11.5144 16.3871 12.4628 16.3871 13.0095 15.9071L17.6511 11.922C18.8339 10.9062 20.6972 10.9062 21.8911 11.922L23.7098 13.4848C24.0557 13.7862 24.1004 14.3109 23.7991 14.6681C23.4978 15.0141 22.9734 15.0588 22.6164 14.7574L20.7976 13.1946C20.2398 12.7146 19.2913 12.7146 18.7335 13.1946L14.0918 17.1797C12.9091 18.1955 11.0457 18.1955 9.85185 17.1797L9.48361 16.856C8.97035 16.4206 8.12236 16.376 7.55331 16.7667L2.05251 20.4615C1.90746 20.5509 1.7401 20.5955 1.58389 20.5955Z" fill="#C0C0C0"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg width="50" height="39" viewBox="0 0 50 39" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group">
<path id="Vector" d="M46.8253 0H3.17465C1.42148 0 0 1.42545 0 3.18364V35.8164C0 37.5746 1.42148 39 3.17465 39H46.8253C48.5785 39 50 37.5745 50 35.8164V3.18364C50 1.42545 48.5786 0 46.8253 0ZM46.8253 3.18364V26.3377L40.5689 20.6334C39.6286 19.7762 38.1825 19.8104 37.2841 20.7122L30.9522 27.0612L18.4675 12.1059C17.5238 10.9756 15.7952 10.9645 14.8373 12.0812L3.17465 25.674V3.18364H46.8253ZM33.3334 11.5408C33.3334 9.12278 35.2872 7.16322 37.6983 7.16322C40.1095 7.16322 42.0634 9.12278 42.0634 11.5408C42.0634 13.9588 40.1096 15.9183 37.6983 15.9183C35.2872 15.9184 33.3334 13.9588 33.3334 11.5408Z" fill="#B6B6B7"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 741 B

+3
View File
@@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14.4699 8.59356C13.8449 7.86435 12.918 7.35755 11.6887 7.07279C12.5501 6.67693 13.071 6.40961 13.2515 6.27079C13.689 5.94436 14.0188 5.5797 14.2407 5.17699C14.4629 4.77412 14.5739 4.32971 14.5739 3.84366C14.5739 3.39232 14.5011 2.96873 14.3552 2.57288C14.2094 2.17695 13.9837 1.81586 13.6782 1.48951C13.3657 1.16323 13.0115 0.899194 12.6157 0.6978C12.2476 0.517312 11.9143 0.381918 11.6156 0.291656C10.9004 0.104126 10.2372 0.0103616 9.62618 0.0103616H8.85534C8.71648 0.0103616 8.57565 0.00861031 8.43332 0.00510781C8.29111 0.00182422 8.21646 0 8.20953 0C8.1749 0 8.1262 0.00182422 8.06352 0.0051443C8.00102 0.00864679 7.95228 0.010398 7.91762 0.010398L7.44879 0.0208691L3.49064 0.156263L0.782405 0.218797L0.824071 1.08329C1.40731 1.15976 1.80331 1.20504 2.01156 1.21883C2.36572 1.23967 2.60531 1.29187 2.73034 1.3751C2.80681 1.43073 2.84848 1.47236 2.85541 1.50013C2.9248 1.65289 2.96289 2.03134 2.96997 2.63556C2.9977 3.66336 3.02904 5.06611 3.06366 6.84381L3.0845 12.0208C3.0845 12.9095 3.0533 13.5833 2.9908 14.0416C2.96304 14.2083 2.89003 14.3853 2.77201 14.5729C2.45255 14.7047 2.0255 14.8125 1.49079 14.8958C1.33117 14.9165 1.095 14.9582 0.782551 15.0209L0.761719 16C2.42136 15.9443 3.36575 15.9062 3.5952 15.8854C5.08118 15.795 6.11602 15.7569 6.69929 15.7707L8.75125 15.8122C9.55708 15.8399 10.2445 15.8017 10.8139 15.6977C11.7166 15.531 12.4212 15.3225 12.9284 15.0725C13.4422 14.8226 13.9282 14.4475 14.3865 13.9476C14.7341 13.5658 14.9803 13.1595 15.1261 12.7288C15.3275 12.1387 15.4281 11.5797 15.4281 11.0518C15.4283 10.1493 15.1089 9.32971 14.4699 8.59356ZM6.31387 1.20858C6.85552 1.11832 7.30691 1.07319 7.66799 1.07319C8.85541 1.07319 9.74103 1.33365 10.3242 1.85443C10.9142 2.37513 11.2095 3.02452 11.2095 3.80222C11.2095 4.90645 10.9005 5.68419 10.2825 6.13554C9.66452 6.58685 8.74782 6.81262 7.5326 6.81262C7.07428 6.81262 6.69583 6.78835 6.39728 6.73976C6.39024 6.50359 6.38677 6.23627 6.38677 5.93761L6.39728 4.91682C6.40414 3.82666 6.3833 2.85797 6.33474 2.01062C6.32081 1.7815 6.31387 1.51432 6.31387 1.20858ZM11.5222 13.2394C11.2652 13.7393 10.8415 14.1317 10.2514 14.4166C9.6611 14.7014 8.91101 14.8436 8.00142 14.8436C7.55697 14.8436 7.07085 14.7327 6.5431 14.5105C6.45977 14.3092 6.41807 14.1561 6.41793 14.052L6.38677 11.2395L6.39728 9.43745V7.93743C6.58481 7.868 6.93553 7.83334 7.44938 7.83334C8.60911 7.83334 9.46663 7.94447 10.0222 8.16662C10.5986 8.38903 11.0882 8.82648 11.491 9.47926C11.7757 9.93772 11.918 10.5626 11.918 11.3543C11.9179 12.125 11.7859 12.7534 11.5222 13.2394Z" fill="#10A37F"/>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

+4
View File
@@ -0,0 +1,4 @@
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.586043 12C0.470141 12 0.356835 11.9657 0.260459 11.9013C0.164082 11.8369 0.0889649 11.7454 0.0446079 11.6383C0.000250994 11.5312 -0.0113526 11.4134 0.0112648 11.2997C0.0338822 11.1861 0.0897046 11.0816 0.171671 10.9997L10.9997 0.171639C11.1096 0.0617403 11.2587 0 11.4141 0C11.5695 0 11.7186 0.0617403 11.8285 0.171639C11.9384 0.281537 12.0001 0.430591 12.0001 0.586011C12.0001 0.741431 11.9384 0.890485 11.8285 1.00038L1.00042 11.8284C0.94605 11.8829 0.881456 11.9261 0.810345 11.9556C0.739235 11.985 0.663008 12.0001 0.586043 12Z" fill="#3F3F3F"/>
<path d="M11.4141 12C11.3372 12.0001 11.2609 11.985 11.1898 11.9556C11.1187 11.9261 11.0541 11.8829 10.9998 11.8284L0.1717 1.00038C0.0618013 0.890485 6.10352e-05 0.741431 6.10352e-05 0.586011C6.10352e-05 0.430591 0.0618013 0.281537 0.1717 0.171639C0.281598 0.0617403 0.430652 0 0.586072 0C0.741492 0 0.890546 0.0617403 1.00044 0.171639L11.8285 10.9997C11.9105 11.0816 11.9663 11.1861 11.9889 11.2997C12.0115 11.4134 11.9999 11.5312 11.9556 11.6383C11.9112 11.7454 11.8361 11.8369 11.7397 11.9013C11.6433 11.9657 11.53 12 11.4141 12Z" fill="#3F3F3F"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

+9
View File
@@ -0,0 +1,9 @@
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<mask id="mask0_596_2078" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="12" height="12">
<path d="M0.5 11.5V0.5H11.5V11.5H0.5Z" fill="white" stroke="white"/>
</mask>
<g mask="url(#mask0_596_2078)">
<path d="M0.254883 0.256836L11.6156 11.7452" stroke="#262626" stroke-width="1.2"/>
<path d="M11.7435 0.256836L0.382812 11.7452" stroke="#262626" stroke-width="1.2"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 509 B

+3
View File
@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M18 6L12 12M12 12L6 18M12 12L18 18M12 12L6 6" stroke="#FF0000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 243 B

+4
View File
@@ -0,0 +1,4 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14 21H16M14 21C13.1716 21 12.5 20.3284 12.5 19.5V17H12M14 21H10M12 17H11.5V19.5C11.5 20.3284 10.8284 21 10 21M12 17V21M10 21H8" stroke="#202124" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M16 3H8C5.17157 3 3.75736 3 2.87868 3.87868C2 4.75736 2 6.17157 2 9V11C2 13.8284 2 15.2426 2.87868 16.1213C3.75736 17 5.17157 17 8 17H16C18.8284 17 20.2426 17 21.1213 16.1213C22 15.2426 22 13.8284 22 11V9C22 6.17157 22 4.75736 21.1213 3.87868C20.2426 3 18.8284 3 16 3Z" stroke="#202124" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 690 B

Some files were not shown because too many files have changed in this diff Show More