version v1.4.1 code update
@@ -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"
|
||||
@@ -1,3 +0,0 @@
|
||||
{
|
||||
"liveServer.settings.port": 5501
|
||||
}
|
||||
@@ -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.
|
||||
|
||||
```
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"Blogmaster": {
|
||||
"Topic": "Topic",
|
||||
"Kewords": "Kewords"
|
||||
},
|
||||
"Blogchild": {
|
||||
"Title": "Title",
|
||||
"Keword": "Kewords",
|
||||
"Articlelength": "Article length",
|
||||
"Tone": "Tone"
|
||||
}
|
||||
}
|
||||
@@ -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')
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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})
|
||||
|
||||
}
|
||||
@@ -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, "/")
|
||||
}
|
||||
@@ -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})
|
||||
|
||||
}
|
||||
@@ -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")
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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})
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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/")
|
||||
|
||||
}
|
||||
@@ -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})
|
||||
|
||||
}
|
||||
@@ -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")
|
||||
)
|
||||
@@ -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)
|
||||
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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"})
|
||||
}
|
||||
@@ -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 you’ve 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)
|
||||
}
|
||||
@@ -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/"})
|
||||
|
||||
// }
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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/")
|
||||
|
||||
}
|
||||
@@ -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})
|
||||
|
||||
}
|
||||
@@ -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/")
|
||||
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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})
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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})
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
@@ -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})
|
||||
}
|
||||
@@ -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})
|
||||
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
}
|
||||
@@ -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/")
|
||||
}
|
||||
@@ -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,
|
||||
})
|
||||
|
||||
}
|
||||
@@ -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"})
|
||||
|
||||
}
|
||||
@@ -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})
|
||||
|
||||
}
|
||||
@@ -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
|
||||
)
|
||||
@@ -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=
|
||||
@@ -0,0 +1 @@
|
||||
package helper
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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 d’identification 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",
|
||||
|
||||
@@ -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": "Разрешены только строчные буквы и цифры"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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.")
|
||||
}
|
||||
@@ -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(¤tCount).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
|
||||
}
|
||||
@@ -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
|
||||
|
||||
}
|
||||
@@ -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"`
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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")))
|
||||
}
|
||||
@@ -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
|
||||
|
||||
}
|
||||
@@ -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
|
||||
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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})
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package middleware
|
||||
|
||||
import "github.com/gin-gonic/gin"
|
||||
|
||||
func TemplateViewAuth() gin.HandlerFunc{
|
||||
|
||||
return func(c *gin.Context) {
|
||||
|
||||
c.Next()
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |