community-version 1.4.0

This commit is contained in:
spurtcmsdeveloper-146
2026-02-05 19:57:39 +05:30
parent 4c29157c9d
commit 21601044b3
349 changed files with 29557 additions and 79117 deletions
Vendored
BIN
View File
Binary file not shown.
+2
View File
@@ -105,3 +105,5 @@ MASTER_BLOCKS_ENDPOINTURL ="https://superadmin.spurtcms.com/defaultblocklist/"
MASTER_CTA_ENDPOINTURL ="https://superadmin.spurtcms.com/defaultctalist/"
MASTER_CHANNELS_ENDPOINTURL ="https://superadmin.spurtcms.com/admin/channels/"
MASTER_INTEGRATION_ENDPOINTURL ="https://superadmin.spurtcms.com/integration/"
+7
View File
@@ -0,0 +1,7 @@
# Secret file
storage/*
logs
.idea
tailwindcss-linux-x64
tailwindcss-v4
+3
View File
@@ -0,0 +1,3 @@
{
"liveServer.settings.port": 5501
}
-20
View File
@@ -1,20 +0,0 @@
run:
go run main.go
buildwithview:
mkdir build
cp -r lang build
cp -r locales build
cp -r public build
cp -r view build
cp -r cms.sql build
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o build/spurtcms-admin
build:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o build/spurtcms-admin
permission:
chmod -R 777 spurtcms-admin
start:
sudo systemctl start spurtcms-admin
+1 -1
View File
@@ -104,7 +104,7 @@ AWS_BUCKET_NAME=your-bucket-name
Open the terminal within the project or cloned folder “spurtcms-admin”, and execute the following command:
```
go run main.go
./spurt-cms
```
Once the project runs successfully, a default website template will open automatically in your browser.
To access the Admin Panel, navigate to the following route in your browser:
-12
View File
@@ -1,12 +0,0 @@
{
"Blogmaster": {
"Topic": "Topic",
"Kewords": "Kewords"
},
"Blogchild": {
"Title": "Title",
"Keword": "Kewords",
"Articlelength": "Article length",
"Tone": "Tone"
}
}
+22 -97
View File
File diff suppressed because one or more lines are too long
-54
View File
@@ -1,54 +0,0 @@
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
}
-292
View File
@@ -1,292 +0,0 @@
package controllers
import (
"fmt"
"net/http"
"os"
"spurt-cms/logger"
"strconv"
"strings"
"sync"
"time"
"github.com/dgrijalva/jwt-go"
"github.com/gin-gonic/gin"
"github.com/gorilla/sessions"
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, "/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) {
//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)
}
/*update password*/
func UpdatePassword(c *gin.Context) {
}
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
}
File diff suppressed because it is too large Load Diff
-842
View File
@@ -1,842 +0,0 @@
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,
}
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,
}
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})
}
}
@@ -1,15 +0,0 @@
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})
}
-110
View File
@@ -1,110 +0,0 @@
package controllers
import (
"encoding/json"
"fmt"
"log"
"spurt-cms/models"
"strconv"
"strings"
"github.com/gin-gonic/gin"
csrf "github.com/utrack/gin-csrf"
)
func ChannelSettingView(c *gin.Context) {
//assign need varibles
var (
limit int
offset int
filter models.Filter
templates []models.TblEmailTemplate
template []models.TblEmailTemplate
templatelists []models.TblEmailTemplate
)
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
filter.Keyword = strings.Trim(c.DefaultQuery("keyword", ""), " ")
if c.Query("limit") == "" {
limit = Limit
} else {
limit, _ = strconv.Atoi(c.Query("limit"))
}
if page != 0 {
offset = (page - 1) * limit
}
flag := false
_, Totaltemplates := models.GetTemplateList(&templates, 0, 0, filter, flag, TenantId)
models.GetTemplateList(&template, limit, offset, filter, flag, TenantId)
for _, val := range template {
if !val.ModifiedOn.IsZero() {
val.DateString = val.ModifiedOn.Format(Datelayout)
} else {
val.DateString = val.CreatedOn.Format(Datelayout)
}
templatelists = append(templatelists, val)
}
paginationendcount := len(template) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(page, int(Totaltemplates), limit)
menu := NewMenuController(c)
translate, _ := TranslateHandler(c)
ModuleName, TabName, moduleid := ModuleRouteName(c)
templatelist, _ := models.GetTemplatesByModuleId(moduleid, TenantId)
c.HTML(200, "channelsettings.html", gin.H{"Pagination": PaginationData{
NextPage: page + 1,
PreviousPage: page - 1,
TotalPages: PageCount,
TwoAfter: page + 2,
TwoBelow: page - 2,
ThreeAfter: page + 3,
}, "Menu": menu, "translate": translate, "Page": Page, "Count": Totaltemplates, "Previous": Previous, "Next": Next, "PageCount": PageCount, "CurrentPage": page, "Limit": limit, "Paginationendcount": paginationendcount, "Paginationstartcount": paginationstartcount, "Filter": filter, "Template": templatelist, "csrf": csrf.GetToken(c), "title": ModuleName, "Emailsmenu": true, "Tooltiptitle": translate.Setting.Emailtooltip, "Tabmenu": TabName, "HeadTitle": translate.Channell.Channels})
}
func ChannelSettingUpdate(c *gin.Context) {
var templatedata []map[string]string
if err := json.Unmarshal([]byte(c.Request.PostFormValue("templatestatus")), &templatedata); err != nil {
log.Println(err)
}
fmt.Println("templatedata", templatedata)
userid := c.GetInt("userid")
var template models.TblEmailTemplate
for _, val := range templatedata {
template.Id, _ = strconv.Atoi(val["templateid"])
template.IsActive, _ = strconv.Atoi(val["status"])
err1 := models.TemplateStatus(template.Id, template.IsActive, userid, TenantId)
if err1 != nil {
log.Println(err1)
}
}
c.SetCookie("get-toast", "Channel Settings Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/entries/settings")
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-48
View File
@@ -1,48 +0,0 @@
package controllers
import (
"log"
"os"
"regexp"
"spurt-cms/config"
"time"
"github.com/gin-gonic/gin"
)
const (
Limit int = 10
MLimit int = 6
)
var (
TZONE, _ = time.LoadLocation(os.Getenv("TIME_ZONE"))
CurrentLanugageId int
Datelayout = "02 Jan 2006 03:04 PM"
LogoPath string
ExpantLogoPath string
PermissionModRoute = []string{}
DB = config.SetupDB()
ErrorLog *log.Logger
WarnLog *log.Logger
Lastlogin = make(map[int]string)
Lang_codearr = []string{"en", "es", "fr", "ger"}
Token string
maxSize = 8 * 1024 * 1024 // 8MB
SecretKey = os.Getenv("JWT_SECRET")
OwndeskUrl = os.Getenv("OWNDESK_URL")
CompanyProfilePath = os.Getenv("COMPANY_PROFILE_PATH")
)
var TenantId string
func Tenant_Id(c *gin.Context) {
TenantId = c.GetString("tenant_id")
}
func RemoveSpecialCharacter(str string) string {
stri := regexp.MustCompile(`[^a-zA-Z0-9 ]+`).ReplaceAllString(str, "")
return stri
}
-497
View File
@@ -1,497 +0,0 @@
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})
}
-202
View File
@@ -1,202 +0,0 @@
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
for i := 0; i < len(memberlist) && i < maxmem; i++ {
memberlist[i].CreatedDate = memberlist[i].CreatedOn.In(TZONE).Format(Datelayout)
if !memberlist[i].ModifiedOn.IsZero() {
memberlist[i].ModifiedDate = memberlist[i].ModifiedOn.In(TZONE).Format(Datelayout)
} else {
memberlist[i].ModifiedDate = memberlist[i].CreatedOn.In(TZONE).Format(Datelayout)
}
memlist = append(memlist, memberlist[i])
}
flag1 := true
Finalchannelslist, _, _ := ChannelConfigWP.ListChannel(chn.Channels{Limit: 100, Offset: 0, IsActive: flag1, TenantId: TenantId})
sort.Slice(Finalchannelslist, func(i, j int) bool {
return Finalchannelslist[i].EntriesCount > Finalchannelslist[j].EntriesCount
})
var chnallist []chn.Tblchannel
for _, val := range Finalchannelslist {
_, _, entrcount, _ := ChannelConfig.ChannelEntriesList(chn.Entries{ChannelId: val.Id, Limit: 0, Offset: 0, Keyword: "", ChannelName: "", Title: "", Status: ""}, TenantId)
val.EntriesCount = entrcount
chnallist = append(chnallist, val)
}
maxRecords := 6
if len(chnallist) < maxRecords {
maxRecords = len(chnallist)
}
topsix_channels := chnallist[:maxRecords]
chnentry, _, _, _ := ChannelConfigWP.ChannelEntriesList(chn.Entries{ChannelId: chaid}, TenantId)
for _, entry := range chnentry {
entry.CreatedDate = entry.CreatedOn.In(TZONE).Format(Datelayout)
if !entry.ModifiedOn.IsZero() {
entry.ModifiedDate = entry.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
entry.ModifiedDate = entry.CreatedOn.In(TZONE).Format(Datelayout)
}
allchnentry = append(allchnentry, entry)
}
maxLength := 6
for i := 0; i < len(allchnentry) && i < maxLength; i++ {
newEntries = append(newEntries, allchnentry[i])
}
BlockConfig.UserId = c.GetInt("userid")
// BlockConfig.DataAccess =
// blocklist, _, _ := BlockConfig.BlockList(100, 0, blocks.Filter{}, TenantId)
blocklist, _, _ := models.BlockLists(100, 0, models.Filter{}, TenantId)
var allblocks []models.TblBlock
for _, block := range blocklist {
block.CreatedDate = block.CreatedOn.In(TZONE).Format(Datelayout)
if !block.ModifiedOn.IsZero() {
block.ModifiedDate = block.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
block.ModifiedDate = block.CreatedOn.In(TZONE).Format(Datelayout)
}
allblocks = append(allblocks, block)
}
for i := 0; i < len(allblocks) && i < maxLength; i++ {
newblocks = append(newblocks, allblocks[i])
}
Formlist, _, _, _ := FormConfig.FormBuildersList(100, 0, formbuilders.Filter{}, TenantId, 1, 0, "", 0)
var allformlist []formbuilders.TblForms
for _, form := range Formlist {
form.CreatedDate = form.CreatedOn.In(TZONE).Format(Datelayout)
if !form.ModifiedOn.IsZero() {
form.ModifiedDate = form.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
form.ModifiedDate = form.CreatedOn.In(TZONE).Format(Datelayout)
}
allformlist = append(allformlist, form)
}
for i := 0; i < len(allformlist) && i < maxLength; i++ {
newformlist = append(newformlist, allformlist[i])
}
// mostlyviewlist, _ := CoursesConfigWP.MostlyViewList(MLimit, TenantId)
// recentlyviewlist, _ := CoursesConfigWP.RecentlyViewList(MLimit, TenantId)
activememberlist, _ := MemberConfigWP.ActiveMemberList(MLimit, TenantId)
var activememberlist1 []mem.Tblmember
for _, val := range activememberlist {
val.DateString = val.LoginTime.In(TZONE).Format(Datelayout)
activememberlist1 = append(activememberlist1, val)
}
translate, _ := TranslateHandler(c)
userdata, _, _ := NewTeam.GetUserById(user_id, []int{})
if !userdata.LastLogin.IsZero() {
Lastactive := userdata.LastLogin.In(TZONE).Format(Datelayout)
Lastlogin[user_id] = Lastactive
} else {
Lastlogin[user_id] = "--"
}
c.HTML(200, "dashboard.html", gin.H{"Menu": menu, "csrf": csrf.GetToken(c), "translate": translate, "memberlist": memlist, "recentactivity": NewActive, "Lastlogin": Lastlogin[user_id], "channelslist": topsix_channels, "newentries": newEntries, "usercount": usercount, "Newusercount": Newusercount, "membercount": membercount, "Newmembercount": Newmembercount, "entriscount": Totalentris, "Newentrycount": Newentrycount, "HeadTitle": translate.Dashboard, "title": translate.Dashboard, "linktitle": "Dashboard", "activememberlist": activememberlist1, "Dashboardmenu": true, "blockcount": Totalblock, "newblockcount": Newblockcount, "Blocklist": newblocks, "Formlist": newformlist})
}
func TruncateDescription(description string, limit int) string {
if len(description) <= limit {
return description
}
truncated := description[:limit] + "..."
return truncated
}
File diff suppressed because it is too large Load Diff
-70
View File
@@ -1,70 +0,0 @@
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/")
}
-151
View File
@@ -1,151 +0,0 @@
package controllers
import (
"fmt"
"spurt-cms/models"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
csrf "github.com/utrack/gin-csrf"
)
func EmailTemplate(c *gin.Context) {
var (
limit, offset int
filter models.Filter
templates []models.TblEmailTemplate
template []models.TblEmailTemplate
templatelists []models.TblEmailTemplate
)
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
if c.Query("limit") == "" {
limit = Limit
} else {
limit, _ = strconv.Atoi(c.Query("limit"))
}
if page != 0 {
offset = (page - 1) * limit
}
filter.Keyword = strings.Trim(c.DefaultQuery("keyword", ""), " ")
flag := false
_, Totaltemplates := models.GetTemplateList(&templates, 0, 0, filter, flag, TenantId)
models.GetTemplateList(&template, limit, offset, filter, flag, TenantId)
for _, val := range template {
if !val.ModifiedOn.IsZero() {
val.DateString = val.ModifiedOn.Format(Datelayout)
} else {
val.DateString = val.CreatedOn.Format(Datelayout)
}
templatelists = append(templatelists, val)
}
paginationendcount := len(template) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(page, int(Totaltemplates), limit)
menu := NewMenuController(c)
translate, _ := TranslateHandler(c)
c.HTML(200, "emailtemplate.html", gin.H{"Pagination": PaginationData{
NextPage: page + 1,
PreviousPage: page - 1,
TotalPages: PageCount,
TwoAfter: page + 2,
TwoBelow: page - 2,
ThreeAfter: page + 3,
}, "Menu": menu, "HeadTitle": translate.Memberss.Email, "translate": translate, "Page": Page, "Count": Totaltemplates, "Previous": Previous, "Next": Next, "PageCount": PageCount, "CurrentPage": page, "Limit": limit, "Paginationendcount": paginationendcount, "Paginationstartcount": paginationstartcount, "Filter": filter, "Template": templatelists, "csrf": csrf.GetToken(c), "SettingsHead": true, "title": "Email Templates", "linktitle": "Email Templates", "Emailsmenu": true, "Tooltiptitle": translate.Setting.Emailtooltip})
}
func EditTemplate(c *gin.Context) {
var (
temp models.TblEmailTemplate
err error
id int
)
id, err = strconv.Atoi(c.Query("id"))
if err != nil {
c.JSON(500, "")
}
models.GetTempdetail(&temp, id, TenantId)
c.JSON(200, temp)
}
func UpdateTemplate(c *gin.Context) {
if c.PostForm("tempdesc") == "" || c.PostForm("tempsub") == "" || c.PostForm("temcont") == "" {
c.SetCookie("Alert-msg", "Pleaseenterthemandatoryfields", 3600, "", "", false, false)
c.Redirect(301, "/admin/settings/emails/")
return
}
var (
template models.TblEmailTemplate
url string
)
fmt.Println("Test")
pageno := c.PostForm("pageno")
pathname := c.PostForm("pathname")
if pathname != "" {
url = pathname
} else if pageno != "" {
url = "/admin/settings/emails?page=" + pageno
} else {
url = "/admin/settings/emails/"
}
template.TemplateName = c.PostForm("tempname")
template.TemplateSubject = (c.PostForm("tempsub"))
template.TemplateMessage = c.PostForm("temcont")
template.TemplateDescription = c.PostForm("tempdesc")
template.ModifiedBy = c.GetInt("userid")
template.Id, _ = strconv.Atoi(c.PostForm("userid"))
template.ModifiedOn, _ = time.Parse("2006-01-02 15:04:05", time.Now().In(TZONE).Format("2006-01-02 15:04:05"))
err := models.UpdateTemplate(&template, TenantId)
if err != nil {
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.Redirect(301, url)
return
}
c.SetCookie("get-toast", "Templateupdatedsuccessfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, url)
}
/* template status*/
func TempIsActive(c *gin.Context) {
id, _ := strconv.Atoi(c.Request.PostFormValue("id"))
val, _ := strconv.Atoi(c.Request.PostFormValue("isactive"))
userid := c.GetInt("userid")
err := models.TemplateStatus(id, val, userid, TenantId)
if err != nil {
c.JSON(500, gin.H{"status": false})
}
c.JSON(200, gin.H{"status": true})
}
File diff suppressed because it is too large Load Diff
-10
View File
@@ -1,10 +0,0 @@
package controllers
import "errors"
var (
ErrInternalServerError = "internalserverr"
ErrLoadLocation = errors.New("timeZone not found")
ErrGettingTemplateList = errors.New("unable to fetch the template list")
ErrGettingTemplateModuleList = errors.New("unable to fetch the template module list")
)
File diff suppressed because it is too large Load Diff
-303
View File
@@ -1,303 +0,0 @@
package controllers
import (
"fmt"
"spurt-cms/models"
storagecontroller "spurt-cms/storage-controller"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
csrf "github.com/utrack/gin-csrf"
)
// set default timezone in general settings
func SetInitialGeneralValues() {
tblgeneralsetting, err := models.GetGeneralSettings(TenantId)
fmt.Println("defaultValues", tblgeneralsetting)
if err != nil {
zone, _ := time.LoadLocation("Asia/Kolkata")
ErrorLog.Printf("Getting data from general settings Error: %s", err)
TZONE = zone
CurrentLanugageId = 1
Datelayout = "02 Jan 2006 3:04 pm"
return
}
CurrentLanugageId = tblgeneralsetting.LanguageId
LogoPath = tblgeneralsetting.LogoPath
ExpantLogoPath = tblgeneralsetting.ExpandLogoPath
Datelayout = DateFormater(tblgeneralsetting.DateFormat, tblgeneralsetting.TimeFormat)
zone, zerr := time.LoadLocation(tblgeneralsetting.TimeZone)
if zerr != nil {
fmt.Println(zerr)
ErrorLog.Printf("Invalid Timezone Error: %s", err)
TZONE = zone
return
}
TZONE = zone
}
func GeneralSettings(c *gin.Context) {
roleId := c.GetInt("role")
fmt.Println("roleId", roleId)
fmt.Println("tenantIdGetSettings", TenantId)
tblgeneralsetting, err := models.GetGeneralSettings(TenantId)
if err != nil {
ErrorLog.Printf("Getting data from general settings Error:%s", err)
}
fmt.Println("dateFormattttt", tblgeneralsetting.DateFormat)
var language1 []models.TblLanguage
query.DataAccess = c.GetInt("dataaccess")
query.UserId = c.GetInt("userid")
Language, _ := query.GetLanguageList(&language1, 0, 0, models.Filter{}, true, TenantId)
selectedtype, err := GetSelectedType()
if err != nil {
ErrorLog.Printf("Getting data from selected type Error:%s", err)
}
if !strings.Contains(tblgeneralsetting.LogoPath, "/public/img/") {
if tblgeneralsetting.LogoPath != "" {
if tblgeneralsetting.StorageType == "local" {
tblgeneralsetting.LogoPath = "/" + tblgeneralsetting.LogoPath
} else if tblgeneralsetting.StorageType == "aws" {
tblgeneralsetting.LogoPath = "/image-resize?name=" + tblgeneralsetting.LogoPath
}
}
}
menu := NewMenuController(c)
translate, _ := TranslateHandler(c)
timezones, err := models.GetTimeZones(TenantId)
if err != nil {
ErrorLog.Printf("Getting data from general settings Error:%s", err)
}
c.HTML(200, "general-settings.html", gin.H{"csrf": csrf.GetToken(c), "HeadTitle": translate.Setting.Generalsettings, "Menu": menu, "translate": translate, "SettingsHead": true, "Generalmenu": true, "Tooltiptitle": translate.Setting.Teamstooltip, "title": "General Settings", "linktitle": "General Settings", "GeneralSetting": tblgeneralsetting, "Langugage": Language, "TimeZone": timezones, "StorageType": selectedtype.SelectedType, "RoleId": roleId})
}
func DateFormater(date string, time string) string {
var Layout string
switch date {
case "dd/mm/yyyy":
if time == "12" {
Layout = "02/01/2006 3:04 pm"
} else {
Layout = "02/01/2006 15:04"
}
case "mm/dd/yyyy":
if time == "12" {
Layout = "01/02/2006 3:04 pm"
} else {
Layout = "01/02/2006 15:04"
}
case "dd-mm-yyyy":
if time == "12" {
Layout = "01-02-2006 3:04 pm"
} else {
Layout = "01-02-2006 15:04"
}
case "yyyy-mm-dd":
if time == "12" {
Layout = "2006-01-02 3:04 pm"
} else {
Layout = "2006-01-02 15:04"
}
case "dd mmm yyyy":
if time == "12" {
Layout = "02 Jan 2006 3:04 pm"
} else {
Layout = "02 Jan 2006 15:04"
}
default:
if time == "12" {
Layout = "02 Jan 2006 3:04 pm"
} else {
Layout = "02 Jan 2006 15:04"
}
}
return Layout
}
func SetTimeZone(timezone string) {
zone, err := time.LoadLocation(timezone)
if err != nil {
fmt.Println(ErrLoadLocation)
fmt.Println("Set Default UTC")
}
TZONE = zone
}
func UpdateGeneralSettings(c *gin.Context) {
companyName := c.PostForm("companyname")
// imagePath1 := c.PostForm("logo_imgpath")
expandimagePath := c.PostForm("expandlogo_imgpath")
dateFormat := c.PostForm("dateformat")
timeForamt := c.PostForm("timeformat")
timezone := c.PostForm("timezon")
languagedefault, _ := strconv.Atoi(c.PostForm("language"))
fmt.Println("dateFOrmat", dateFormat)
var (
imgPath string
err error
)
response := make(gin.H)
storageType, err := GetSelectedType()
if err != nil {
ErrorLog.Println(err)
response["status"] = 0
c.AbortWithStatusJSON(500, response)
return
}
if strings.Contains(expandimagePath, "data:image/jpeg;base64") || strings.Contains(expandimagePath, "data:image/png;base64") || strings.Contains(expandimagePath, "data:image/svg+xml;base64") {
tenantDetails, err := NewTeam.GetTenantDetails(TenantId)
if err != nil {
ErrorLog.Println(err)
response["status"] = 0
c.AbortWithStatusJSON(500, response)
return
}
if storageType.SelectedType == "aws" {
var (
tempString, imageName string
imageByte []byte
)
imageName, tempString, imageByte, err = ConvertBase64toByte(expandimagePath, "user")
if err != nil {
ErrorLog.Println(err)
response["status"] = 0
c.AbortWithStatusJSON(500, response)
return
}
tempString = tenantDetails.S3FolderName + tempString
err = storagecontroller.UploadCropImageS3(imageName, tempString, imageByte)
if err != nil {
ErrorLog.Println(err)
c.SetCookie("Alert-msg", "ERRORAWScredentialsnotfound", 3600, "", "", false, false)
response["status"] = 0
c.AbortWithStatusJSON(500, response)
return
}
imgPath = tempString
} else if storageType.SelectedType == "local" {
var tempImgPath string
_, tempImgPath, err = ConvertBase64(expandimagePath, "storage/user")
if err != nil {
ErrorLog.Println(err)
response["status"] = 0
c.AbortWithStatusJSON(500, response)
return
}
imgPath = "/" + tempImgPath
}
} else {
prefixEndIndex := strings.Index(expandimagePath, "=")
fmt.Println("prefix", prefixEndIndex)
prefixRemovedPath := expandimagePath[prefixEndIndex+1:]
fmt.Println("prefixRemoved", prefixRemovedPath)
imgPath = prefixRemovedPath
}
var gensetting models.TblGeneralSetting
gensetting.CompanyName = companyName
gensetting.LogoPath = imgPath
// gensetting.ExpandLogoPath = imgPath
gensetting.DateFormat = dateFormat
fmt.Println("dateFormat", gensetting.DateFormat)
gensetting.TimeFormat = timeForamt
gensetting.TimeZone = timezone
gensetting.LanguageId = languagedefault
models.SetDefaultLang(gensetting.LanguageId, 0, TenantId)
gensetting.ModifiedBy = c.GetInt("userid")
gensetting.ModifiedOn, _ = time.Parse("2006-01-02 15:04:05", time.Now().In(TZONE).Format("2006-01-02 15:04:05"))
gensetting.StorageType = storageType.SelectedType
err = models.UpdateGeneralSettings(gensetting, TenantId)
if err != nil {
ErrorLog.Println(err)
// c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
// c.Redirect(301, "/settings/general-settings/")
response["status"] = 0
c.AbortWithStatusJSON(500, response)
return
}
SetTimeZone(timezone)
Datelayout = DateFormater(dateFormat, timeForamt)
CurrentLanugageId = languagedefault
c.SetCookie("lang", string(languagedefault), 3600, "", "", false, false)
// LogoPath = imagePath1
ExpantLogoPath = expandimagePath
// c.SetCookie("get-toast", "General Settings Updated Successfully", 3600, "", "", false, false)
// c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
// c.Redirect(301, "/settings/general-settings/")
response["status"] = 1
c.JSON(200, response)
}
File diff suppressed because one or more lines are too long
-854
View File
@@ -1,854 +0,0 @@
package controllers
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"os"
"strconv"
"strings"
"spurt-cms/models"
storagecontroller "spurt-cms/storage-controller"
"github.com/gin-gonic/gin"
"github.com/spurtcms/auth"
"github.com/spurtcms/blocks"
menu "github.com/spurtcms/menu"
csrf "github.com/utrack/gin-csrf"
)
func GoTemplates(c *gin.Context) {
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
}
var (
goTemplateList []menu.TblGoTemplates
count int
err error
count2 int64
)
goTemplateList, count1, err := MenuConfig.GoTemplatesList(TenantId)
if err != nil {
fmt.Println(err)
}
count = int(count1)
if count == 0 {
goTemplateList, count2, err = MenuConfig.GoTemplatesList("")
if err != nil {
fmt.Println(err)
}
count = int(count2)
}
var modulenames []string
moduleNameSet := make(map[string]struct{})
for _, tpl := range goTemplateList {
if tpl.TemplateModuleName != "" {
if _, exists := moduleNameSet[tpl.TemplateModuleName]; !exists {
modulenames = append(modulenames, tpl.TemplateModuleName)
moduleNameSet[tpl.TemplateModuleName] = struct{}{}
}
}
}
go_template_default, _ := c.Get("go_template_default")
webbanner, _ := c.Cookie("webbanner")
if webbanner == "" {
webbanner = "true"
}
ModuleName, _, _ := ModuleRouteName(c)
translate, _ := TranslateHandler(c)
c.HTML(200, "go_template.html", gin.H{
"csrf": csrf.GetToken(c),
"modulenames": modulenames, // always sorted!
"webbanner": webbanner,
"Menu": NewMenuController(c),
"linktitle": "Website",
"translate": translate,
"title": ModuleName,
"goTemplateList": goTemplateList,
"count": count,
"go_template_default": go_template_default,
})
}
func GoTemplateUpdate(c *gin.Context) {
templateId, _ := strconv.Atoi(c.Param("id"))
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
}
if permisison {
userid := c.GetInt("userid")
err := NewTeam.UpdateGoTemplate(templateId, userid, TenantId)
if err != nil {
fmt.Println(err)
}
c.SetCookie("get-toast", "Template Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/admin/website/")
}
}
//Template edit Page//
func TemplateEditPage(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
}
if limit == "" {
limt = Limit
} else {
limt, _ = strconv.Atoi(limit)
}
if pageno != 0 {
offset = (pageno - 1) * limt
}
permisison, perr := NewAuth.IsGranted("Website", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("website authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("website authorization error")
c.Redirect(301, "/403-page")
return
}
webid, _ := strconv.Atoi(c.Param("id"))
Websitedet, _ := MenuConfig.GetWebsiteById(webid, TenantId)
templatedetail, err := MenuConfig.GetTemplateById(Websitedet.TemplateId, TenantId)
if err != nil {
fmt.Println(err)
}
templatedetail.DateString = templatedetail.CreatedOn.In(TZONE).Format(Datelayout)
templatepagelist, count, err := MenuConfig.GetTemplatePageList(limt, offset, filter, TenantId, webid)
var pagelist []menu.TblTemplatePages
for _, page := range templatepagelist {
page.CreatedDate = page.CreatedOn.In(TZONE).Format(Datelayout)
if !page.ModifiedOn.IsZero() {
page.ModifiedDate = page.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
page.ModifiedDate = page.CreatedOn.In(TZONE).Format(Datelayout)
}
pagelist = append(pagelist, page)
}
if err != nil {
fmt.Println(err)
}
paginationendcount := len(pagelist) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(pageno, int(count), limt)
ModuleName, _, _ := ModuleRouteName(c)
translate, _ := TranslateHandler(c)
c.HTML(200, "go_template_edit.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), "Searchtrue": filterflag, "Count": count, "Limit": limt, "templatepagelist": pagelist, "templatedetail": templatedetail, "websitedetail": Websitedet, "Menu": NewMenuController(c), "linktitle": "Website Page", "translate": translate, "title": ModuleName, "Paginationendcount": paginationendcount, "Previous": Previous, "Next": Next, "PageCount": PageCount, "CurrentPage": pageno, "Page": Page, "Filter": filter, "Paginationstartcount": paginationstartcount})
}
// Template Add Page//
func AddPageInWebsite(c *gin.Context) {
permisison, perr := NewAuth.IsGranted("Website", 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
}
var editpage bool
var mode string
pageid, _ := strconv.Atoi(c.Param("id"))
if pageid != 0 {
editpage = true
mode = "edit"
} else {
mode = "create"
}
webid, _ := strconv.Atoi(c.Query("webid"))
PageDetail, _ := MenuConfig.GetPageById(pageid, TenantId)
fmt.Println(PageDetail.PageDescription, "descriptionnnn")
Websitedet, _ := MenuConfig.GetWebsiteById(webid, TenantId)
templatedetail, err := MenuConfig.GetTemplateById(Websitedet.TemplateId, TenantId)
if err != nil {
fmt.Println(err)
}
channelist, clerr := ChannelConfig.GetPermissionChannel(TenantId)
if clerr != nil {
ErrorLog.Printf("create Entry listchannel error: %s", clerr)
}
templatedetail.DateString = templatedetail.CreatedOn.In(TZONE).Format(Datelayout)
var bytedata1 []byte
var bytedata2 []byte
var finalblocklist []blocks.TblBlock
blocklist, _, err := BlockConfig.BlockList(0, 0, blocks.Filter{}, TenantId)
if err != nil {
fmt.Println("collection list", err)
}
for _, val := range blocklist {
var first = val.FirstName
var last = val.LastName
var firstn = strings.ToUpper(first[:1])
var lastn string
if val.LastName != "" {
lastn = strings.ToUpper(last[:1])
}
val.ChannelNames = strings.Split(val.ChannelSlugname, ",")
var Name = firstn + lastn
val.NameString = Name
tagname := strings.Split(val.TagValue, ",")
val.TagValueArr = append(val.TagValueArr, tagname...)
img := val.CoverImage
imgcontain := "/image-resize?name="
flag := strings.Contains(img, imgcontain)
if !flag {
val.CoverImage = "/image-resize?name=" + val.CoverImage
}
if val.ProfileImagePath != "" {
userimg := val.ProfileImagePath
imgflag := strings.Contains(userimg, imgcontain)
if !imgflag {
val.ProfileImagePath = "/image-resize?name=" + val.ProfileImagePath
}
}
finalblocklist = append(finalblocklist, val)
}
data := map[string]interface{}{"data": finalblocklist}
bytedata1, _ = json.Marshal(data)
if permisison {
endurl := os.Getenv("MASTER_BLOCKS_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()
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()
}
var responseData ResponseData
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
}
}
if !masterconnect {
responseData = ResponseData{
DefaultList: []models.TblMstrBlocks{},
AllList: []models.TblMstrBlocks{},
FinalblockList: []models.TblMstrBlocks{},
BlockCount: 0,
}
}
permisison, perr := NewAuth.IsGranted("Blocks", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("block collection list authorization error: %s", perr)
c.Redirect(301, "/403-page")
return
}
if !permisison {
ErrorLog.Printf("Block authorization error: %s", perr)
c.Redirect(301, "/403-page")
return
}
blockBannerValue, _ := c.Cookie("blockbanner")
if blockBannerValue == "" {
blockBannerValue = "true"
}
// fmt.Println(responseData.FinalblockList,"checkdata")
data := map[string]interface{}{"data": responseData.FinalblockList}
bytedata2, _ = json.Marshal(data)
}
selectedtype, _ := GetSelectedType()
baseurl := os.Getenv("BASE_URL")
urlpath := map[string]interface{}{"path": baseurl + "uploadb64image", "payload": "imagedata", "success": map[string]interface{}{"imagepath": "imagepath", "imagename": "imagename"}}
newpath := os.Getenv("BASE_URL")
ubyte, _ := json.Marshal(urlpath)
templatepagelist, _, err := MenuConfig.GetTemplatePageList(100, 0, menu.Filter{}, TenantId, webid)
ModuleName, _, _ := ModuleRouteName(c)
translate, _ := TranslateHandler(c)
c.HTML(200, "go_template_addpage.html", gin.H{"csrf": csrf.GetToken(c), "channellist": channelist, "websitedetail": Websitedet, "pagelist": templatepagelist, "PageDetail": PageDetail, "editpage": editpage, "Storagepath": string(ubyte), "uploadurl": newpath, "StorageType": selectedtype.SelectedType, "blocks": string(bytedata1), "defaultblocks": string(bytedata2), "Mode": mode, "templatedetail": templatedetail, "Menu": NewMenuController(c), "linktitle": "Website", "translate": translate, "title": ModuleName})
}
//save page Name//
func SavePage(c *gin.Context) {
permisison, perr := NewAuth.IsGranted("Website", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("website authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("website authorization error")
c.Redirect(301, "/403-page")
return
}
pagename := c.PostForm("page_name")
userid := c.GetInt("userid")
webid, _ := strconv.Atoi(c.PostForm("webid"))
pageid, _ := strconv.Atoi(c.PostForm("pageid"))
pagedata := c.PostForm("pagedata")
var pagedet menu.TblTemplatePages
var err error
if pageid != 0 {
pageinfo := menu.TblTemplatePages{
Id: pageid,
Name: pagename,
TenantId: TenantId,
ModifiedBy: userid,
PageDescription: pagedata,
WebsiteId: webid,
}
pagedet, err = MenuConfig.EditTemplatePage(&pageinfo)
if err != nil {
fmt.Println(err)
c.JSON(500, gin.H{"error": err.Error()})
return
}
} else {
pageinfo := menu.TblTemplatePages{
Name: pagename,
TenantId: TenantId,
CreatedBy: userid,
IsDeleted: 0,
Status: 1,
WebsiteId: webid,
}
pagedet, err = MenuConfig.CreateTemplatePage(&pageinfo)
if err != nil {
fmt.Println(err)
c.JSON(500, gin.H{"error": err.Error()})
return
}
}
c.JSON(200, gin.H{"page": pagedet})
}
//Delete Page
func DeletePage(c *gin.Context) {
permisison, perr := NewAuth.IsGranted("Website", auth.CRUD, TenantId)
if perr != nil {
ErrorLog.Printf("website authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("website authorization error")
c.Redirect(301, "/403-page")
return
}
pageid, _ := strconv.Atoi(c.Param("id"))
pageno := c.Query("page")
userid := c.GetInt("userid")
webid := c.Query("webid")
var url string
if pageno != "" {
url = "/admin/website/pages/" + webid + "?page=" + pageno
} else {
url = "/admin/website/pages/" + webid
}
err := MenuConfig.DeletePage(pageid, 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", "Page Deleted Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, url)
}
//Status Change
func PageStatusChange(c *gin.Context) {
pageid, _ := strconv.Atoi(c.PostForm("id"))
fmt.Println(pageid, "pageiddd")
userid := c.GetInt("userid")
val, _ := strconv.Atoi(c.Request.PostFormValue("isactive"))
permisison, perr := NewAuth.IsGranted("Website", auth.Update, TenantId)
if perr != nil {
ErrorLog.Printf("delete menu authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("Website authorization error")
c.Redirect(301, "/403-page")
return
}
flg, err := MenuConfig.PageStatusChange(pageid, val, userid, TenantId)
if err != nil {
ErrorLog.Printf("menu status change error: %s", perr)
json.NewEncoder(c.Writer).Encode(flg)
} else {
json.NewEncoder(c.Writer).Encode(flg)
}
}
//SEO Page
func Seo(c *gin.Context) {
webid, _ := strconv.Atoi(c.Query("webid"))
seodetail, err := MenuConfig.SeoDetail(TenantId, webid)
if err != nil {
fmt.Println(err)
}
webbanner, _ := c.Cookie("webbanner")
if webbanner == "" {
webbanner = "true"
}
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
}
var pages bool
if webid != 0 {
pages = true
}
Websitedet, _ := MenuConfig.GetWebsiteById(webid, TenantId)
templatedetail, err := MenuConfig.GetTemplateById(Websitedet.TemplateId, TenantId)
if err != nil {
fmt.Println(err)
}
templatedetail.DateString = templatedetail.CreatedOn.In(TZONE).Format(Datelayout)
ModuleName, _, _ := ModuleRouteName(c)
translate, _ := TranslateHandler(c)
c.HTML(200, "seo.html", gin.H{"csrf": csrf.GetToken(c), "websitedetail": Websitedet, "gotemplatepageheader": pages, "templatedetail": templatedetail, "webbanner": webbanner, "Menu": NewMenuController(c), "linktitle": "SEO", "translate": translate, "title": ModuleName, "seodetail": seodetail})
}
func SeoPage(c *gin.Context) {
pagetitle := c.PostForm("pagetitle")
pagedescription := c.PostForm("pagedescription")
pagekeyword := c.PostForm("pagekeyword")
storetitle := c.PostForm("storetitle")
storedescription := c.PostForm("storedescription")
storekeyword := c.PostForm("storekeyword")
imagedata := c.PostForm("sitemapimage")
webid := c.Query("webid")
websiteid, _ := strconv.Atoi(c.Query("webid"))
var url string
if webid != "" && webid != "0" {
url = "?webid=" + webid
}
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
}
if permisison {
var imageName, imagePath string
var imageByte []byte
tenantDetails, err := NewTeam.GetTenantDetails(TenantId)
if err != nil {
ErrorLog.Printf("error get storage type error: %s", err)
}
if imagedata != "" {
imageName, imagePath, imageByte, _ = ConvertBase64toByte(imagedata, "seo")
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/website/seo"+url)
return
}
}
seo := menu.TblGoTemplateSeo{
PageTitle: pagetitle,
PageDescription: pagedescription,
PageKeyword: pagekeyword,
StoreTitle: storetitle,
StoreDescription: storedescription,
StoreKeyword: storekeyword,
SiteMapName: imageName,
SiteMapPath: imagePath,
TenantId: TenantId,
WebsiteId: websiteid,
}
if pagetitle != "" || storetitle != "" || imageName != "" {
err := MenuConfig.SeoUpdate(seo)
if err != nil {
fmt.Println(err)
}
c.SetCookie("get-toast", "SEO Details Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
}
c.Redirect(301, "/admin/website/seo"+url)
}
}
//Settings Page
func Settings(c *gin.Context) {
webid, _ := strconv.Atoi(c.Query("webid"))
settingsdetail, err := MenuConfig.SettingsDetail(TenantId, webid)
if err != nil {
fmt.Println(err)
}
webbanner, _ := c.Cookie("webbanner")
if webbanner == "" {
webbanner = "true"
}
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
}
var pages bool
if webid != 0 {
pages = true
}
Websitedet, _ := MenuConfig.GetWebsiteById(webid, TenantId)
templatedetail, err := MenuConfig.GetTemplateById(Websitedet.TemplateId, TenantId)
if err != nil {
fmt.Println(err)
}
templatedetail.DateString = templatedetail.CreatedOn.In(TZONE).Format(Datelayout)
ModuleName, _, _ := ModuleRouteName(c)
translate, _ := TranslateHandler(c)
c.HTML(200, "template_setting.html", gin.H{"csrf": csrf.GetToken(c), "websitedetail": Websitedet, "gotemplatepageheader": pages, "templatedetail": templatedetail, "webbanner": webbanner, "Menu": NewMenuController(c), "linktitle": "Setting", "translate": translate, "title": ModuleName, "settingsdetail": settingsdetail})
}
func SettingPage(c *gin.Context) {
siteName := c.PostForm("siteName")
sitelogoimage := c.PostForm("sitelogoimage")
sitefaviconimage := c.PostForm("sitefaviconimage")
websiteInput := c.PostForm("websiteInput")
webid := c.Query("webid")
websiteid, _ := strconv.Atoi(c.Query("webid"))
var url string
if webid != "" && webid != "0" {
url = "?webid=" + webid
}
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
}
if permisison {
var imageName, imagePath, favimageName, favimagePath string
var imageByte, favimageByte []byte
tenantDetails, err := NewTeam.GetTenantDetails(TenantId)
if err != nil {
ErrorLog.Printf("error get storage type error: %s", err)
}
if sitelogoimage != "" {
imageName, imagePath, imageByte, _ = ConvertBase64toByte(sitelogoimage, "setting")
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/website/setting"+url)
return
}
}
if sitefaviconimage != "" {
favimageName, favimagePath, favimageByte, _ = ConvertBase64toByte(sitefaviconimage, "setting")
favimagePath = tenantDetails.S3FolderName + favimagePath
uerr := storagecontroller.UploadCropImageS3(favimageName, favimagePath, favimageByte)
if uerr != nil {
c.SetCookie("Alert-msg", "ERRORAWScredentialsnotfound", 3600, "", "", false, false)
c.Redirect(301, "/admin/website/setting"+url)
return
}
}
setting := menu.TblGoTemplateSettings{
SiteName: siteName,
SiteLogo: imageName,
SiteLogoPath: imagePath,
SiteFavIcon: favimageName,
SiteFavIconPath: favimagePath,
WebsiteUrl: websiteInput,
TenantId: TenantId,
WebsiteId: websiteid,
}
if siteName != "" || imageName != "" || favimageName != "" || websiteInput != "" {
err := MenuConfig.SettingUpdate(setting)
if err != nil {
fmt.Println(err)
}
c.SetCookie("get-toast", "Settings Details Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
}
c.Redirect(301, "/admin/website/setting"+url)
}
}
func CheckDomainName(c *gin.Context) {
subdomain := c.PostForm("subdomain")
userid := c.GetInt("userid")
err := NewTeamWP.CheckDomainName(subdomain, userid, TenantId)
if err != nil {
c.JSON(200, gin.H{"status": true})
return
}
c.JSON(200, gin.H{"status": false})
}
-348
View File
@@ -1,348 +0,0 @@
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"
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"`
}
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("Website", 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 := MenuConfig.GoTemplatesList("")
// 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, "/")
fmt.Println(goTemplateList, "templatelist")
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"
}
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 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
}
//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")
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,
}
_, err1 := MenuConfig.CreateWebsite(websiteinfo)
if err1 != nil {
fmt.Println(err1)
}
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")
fmt.Println(sitename, channelname, "checkdata")
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", "Website Updated Successfully", 3600, "", "", false, false)
c.Redirect(301, "/admin/website/")
}
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("Website", 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)
}
-283
View File
@@ -1,283 +0,0 @@
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)
}
fmt.Println(tokenIds, "tokenidesss")
for _, ids := range tokenIds {
intIds, _ := strconv.Atoi(ids)
tokenIntIds = append(tokenIntIds, intIds)
}
pageno := c.PostForm("page")
fmt.Println("pageNonnnn", pageno)
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"})
}
-711
View File
@@ -1,711 +0,0 @@
package controllers
import (
"fmt"
"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)
}
fmt.Println("isDefault", isDefault)
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/"})
// }
-806
View File
@@ -1,806 +0,0 @@
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
}
fmt.Println(offset, limit, "offset")
search := strings.TrimSpace(c.Query("keyword"))
menu := NewMenuController(c)
translate, _ := TranslateHandler(c)
_, _, Media, nextcont, _ := GetMedia1(search, "")
Folder, File, _ := S3ArrPagination(Media, limt, offset)
fmt.Println(Folder, "totalmediaa")
ModuleName, TabName, _ := ModuleRouteName(c)
selectedtype, _ := GetSelectedType()
var paginationendcount = len(Folder) + len(File) + offset
paginationstartcount := offset + 1
fmt.Println(paginationendcount, paginationstartcount, "startendcount")
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()
fmt.Println(deleteid, ids, folderpath, "deletedetails")
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" {
fmt.Println("Local selected")
UploadErr = storagecontroller.UploadImageLocal(file, fileheader, c.Request.PostFormValue("path"), c)
} else if selectedtype.SelectedType == "aws" {
fmt.Println("s3 selected")
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 {
fmt.Println("please check the aws fields")
return []storagecontroller.Medias{}, []storagecontroller.Medias{}, []storagecontroller.Medias{}, nextcont, err
}
Folder, File = MakeFolderandFileArr(resp1, "media/"+folderpath, search)
}
sort.SliceStable(Folder, func(i, j int) bool {
return Folder[i].ModTime.Unix() > Folder[j].ModTime.Unix()
})
sort.SliceStable(File, func(i, j int) bool {
return File[i].ModTime.Unix() > File[j].ModTime.Unix()
})
Media = append(Media, Folder...)
Media = append(Media, File...)
return Folder, File, Media, nextcont, nil
}
func S3ArrPagination(Media []storagecontroller.Medias, limit int, offset int) (s []storagecontroller.Medias, f []storagecontroller.Medias, m []storagecontroller.Medias) {
var (
Files []storagecontroller.Medias
Folders []storagecontroller.Medias
Medias []storagecontroller.Medias
)
end := limit + offset
if end > len(Media) {
end = len(Media)
}
for i := offset; i < end; i++ {
if Media[i].File {
var Folde storagecontroller.Medias
Folde.File = true
Folde.Path = Media[i].Path
Folde.AliaseName = Media[i].AliaseName
Folde.TotalSubMedia = Media[i].TotalSubMedia
Folde.Name = Media[i].Name
Folders = append(Folders, Folde)
} else {
var files storagecontroller.Medias
files.File = false
files.Name = Media[i].Name
files.AliaseName = Media[i].AliaseName
files.Path = Media[i].Path
files.ModTime = Media[i].ModTime
Files = append(Files, files)
}
Medias = append(Medias, Media[i])
}
return Folders, Files, Medias
}
func RenameMediaPath(c *gin.Context) {
oldFilename := c.PostForm("oldfilename")
newFilename := c.PostForm("newfilename")
filetype := c.PostForm("filetype")
newFilename1 := filepath.Dir(oldFilename)
if !strings.HasSuffix(newFilename1, "/") {
newFilename1 += "/"
}
var oldObjectKey string
var newObjectKey string
if filetype == "filediv" {
oldObjectKey = oldFilename
newObjectKey = newFilename1 + newFilename
} else if filetype == "folderdiv" {
oldObjectKey = oldFilename + "/"
newObjectKey = newFilename1 + newFilename + "/"
}
selectedtype, _ := GetSelectedType()
fmt.Println(oldObjectKey, newObjectKey, "checkrenameee")
if selectedtype.SelectedType == "local" {
fmt.Println("Local selected")
} else if selectedtype.SelectedType == "aws" {
fmt.Println("s3 selected")
err1 := storagecontroller.RenameFileS3(oldObjectKey, newObjectKey)
fmt.Println(err1, "getting error from renameprocess")
} else if selectedtype.SelectedType == "azure" {
} else if selectedtype.SelectedType == "drive" {
fmt.Println("drive selected")
}
json.NewEncoder(c.Writer).Encode(true)
}
-82
View File
@@ -1,82 +0,0 @@
package controllers
import (
"fmt"
"spurt-cms/models"
"github.com/gin-gonic/gin"
csrf "github.com/utrack/gin-csrf"
"gorm.io/datatypes"
)
func MediaSettings(c *gin.Context) {
menu := NewMenuController(c)
ModuleName, TabName, _ := ModuleRouteName(c)
Storagetype, err := models.GetStorageValue(TenantId)
if err != nil {
fmt.Println(err)
}
var aws models.AWS
if Storagetype.Aws != nil {
aws.AccessId = Storagetype.Aws["AccessId"].(string)
aws.AccessKey = Storagetype.Aws["AccessKey"].(string)
aws.Region = Storagetype.Aws["Region"].(string)
aws.BucketName = Storagetype.Aws["BucketName"].(string)
}
var azure models.Azure
if Storagetype.Azure != nil {
azure.StorageAccount = Storagetype.Azure["AzureAccount"].(string)
azure.AccountKey = Storagetype.Azure["AzureKey"].(string)
azure.ContainerName = Storagetype.Azure["AzureContainer"].(string)
}
translate, _ := TranslateHandler(c)
c.HTML(200, "media_settings.html", gin.H{"Menu": menu, "Mediamenu": true, "title": ModuleName, "Tabmenu": TabName, "HeadTitle": "Media", "csrf": csrf.GetToken(c), "aws": aws, "azure": azure, "local": Storagetype.Local, "Storage": Storagetype, "translate": translate})
}
func MediaStorageUpdate(c *gin.Context) {
selectedtype := c.Request.PostFormValue("type")
local := c.PostForm("local")
awsid := c.PostForm("awsid")
awskey := c.PostForm("awskey")
awsregion := c.PostForm("awsregion")
awsbucketname := c.PostForm("awsbucketname")
azureacc := c.PostForm("azureacc")
azurekey := c.PostForm("azurekey")
azurecontainer := c.PostForm("azurecontainer")
var Stype models.TblStorageType
Stype.Local = local
Stype.Aws = datatypes.JSONMap{"AccessId": awsid, "AccessKey": awskey, "Region": awsregion, "BucketName": awsbucketname}
Stype.Azure = datatypes.JSONMap{"AzureAccount": azureacc, "AzureKey": azurekey, "AzureContainer": azurecontainer}
Stype.SelectedType = selectedtype
_, err := models.UpdateStorageType(Stype, TenantId)
if err != nil {
fmt.Println(err)
c.SetCookie("get-toast", ErrInternalServerError, 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/media/settings/")
return
}
c.SetCookie("get-toast", "Media Settings Updated Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, "/media/settings/")
}
File diff suppressed because it is too large Load Diff
-522
View File
@@ -1,522 +0,0 @@
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("View", 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("Create", 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("Update", 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("Delete", auth.Delete, TenantId)
if perr != nil {
ErrorLog.Printf("Member Group List authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("Membergroup authorization error: %s", perr)
c.Redirect(301, "/403-page")
return
}
if permisison {
err := MemberConfig.DeleteMemberGroup(MemberGroupId, userid, TenantId) //delete member group
if err != nil {
ErrorLog.Printf("membergroup delete error: %s", err)
}
_, Total_membergrp, err := MemberConfig.ListMemberGroup(mem.MemberGroupListReq{Keyword: ""}, TenantId)
if err != nil {
ErrorLog.Printf("membergroup list details error: %s", err)
}
recordsPerPage := Limit
totalPages := (int(Total_membergrp) + recordsPerPage - 1) / recordsPerPage
currentPage := 1
if pageno != "" {
currentPage, _ = strconv.Atoi(pageno)
}
if currentPage > totalPages && totalPages > 0 {
url = "/admin/usergroup?page=" + strconv.Itoa(totalPages)
}
fmt.Println("url", url)
if err != nil {
c.SetCookie("Alert-msg", ErrInternalServerError, 3600, "", "", false, false)
c.SetCookie("Alert-msg", "alert", 3600, "", "", false, false)
c.Redirect(301, url)
return
}
c.SetCookie("get-toast", "Member Group Deleted Successfully", 3600, "", "", false, false)
c.SetCookie("Alert-msg", "success", 3600, "", "", false, false)
c.Redirect(301, url)
}
}
/*Update Member Group status*/
func MemberIsActive(c *gin.Context) {
//get values from html from data
id, _ := strconv.Atoi(c.Request.PostFormValue("id"))
val, _ := strconv.Atoi(c.Request.PostFormValue("isactive"))
userid := c.GetInt("userid")
permisison, perr := NewAuth.IsGranted("Members Group", auth.Update, TenantId)
if perr != nil {
ErrorLog.Printf("Member Group List authorization error: %s", perr)
}
if !permisison {
ErrorLog.Printf("Membergroup authorization error: %s", perr)
c.Redirect(301, "/403-page")
return
}
if permisison {
flg, err := MemberConfig.MemberGroupIsActive(id, val, userid, TenantId) //update member group status
if err != nil {
ErrorLog.Printf("membergroup status update error: %s", err)
json.NewEncoder(c.Writer).Encode(flg)
} else {
json.NewEncoder(c.Writer).Encode(flg)
}
}
}
func CheckNameInMemberGroup(c *gin.Context) {
id, _ := strconv.Atoi(c.PostForm("membergroup_id"))
name := c.PostForm("membergroup_name")
permisison, perr := NewAuth.IsGranted("Members Group", auth.Read, TenantId)
if perr != nil {
ErrorLog.Printf("multi group delete authorization error :%s", perr)
}
if !permisison {
ErrorLog.Printf("Membergroup authorization error: %s", perr)
c.Redirect(301, "/403-page")
return
}
if permisison {
flg, err := MemberConfig.CheckNameInMemberGroup(id, name, TenantId)
if err != nil {
ErrorLog.Printf("check name in member error :%s", perr)
json.NewEncoder(c.Writer).Encode(false)
return
}
json.NewEncoder(c.Writer).Encode(flg)
}
}
func MultiSelectDeleteMembergroup(c *gin.Context) {
var (
memberdata []map[string]string
Memberids []int
url string
)
if err := json.Unmarshal([]byte(c.Request.PostFormValue("memberids")), &memberdata); err != nil {
fmt.Println(err)
}
for _, val := range memberdata {
memberid, _ := strconv.Atoi(val["memberid"])
Memberids = append(Memberids, memberid)
}
pageno := c.PostForm("page")
if pageno != "" {
url = "/admin/usergroup?page=" + pageno
} else {
url = "/admin/usergroup/"
}
userid := c.GetInt("userid")
permisison, perr := NewAuth.IsGranted("Members Group", auth.Delete, TenantId)
if perr != nil {
ErrorLog.Printf("multi group delete authorization error :%s", perr)
}
if !permisison {
ErrorLog.Printf("Membergroup authorization error: %s", perr)
c.JSON(200, gin.H{"value": false, "url": "/403-page"})
return
}
if permisison {
_, err := MemberConfig.MultiSelectedMemberDeletegroup(Memberids, userid, TenantId)
if err != nil {
ErrorLog.Printf("multi group delete error :%s", perr)
c.JSON(200, gin.H{"value": false})
return
}
_, Total_membergrp, err := MemberConfig.ListMemberGroup(mem.MemberGroupListReq{Keyword: ""}, TenantId)
if err != nil {
ErrorLog.Printf("membergroup list details error: %s", err)
}
recordsPerPage := Limit
totalPages := (int(Total_membergrp) + recordsPerPage - 1) / recordsPerPage
currentPage := 1
if pageno != "" {
currentPage, _ = strconv.Atoi(pageno)
}
if currentPage > totalPages && totalPages > 0 {
url = "/admin/usergroup?page=" + strconv.Itoa(totalPages)
}
c.JSON(200, gin.H{"value": true, "url": url})
}
}
func MultiSelectMembersgroupStatus(c *gin.Context) {
var (
memberdata []map[string]string
memberids []int
statusint int
status int
)
if err := json.Unmarshal([]byte(c.Request.PostFormValue("memberids")), &memberdata); err != nil {
fmt.Println(err)
}
for _, val := range memberdata {
memberid, _ := strconv.Atoi(val["memberid"])
statusint, _ = strconv.Atoi(val["status"])
if statusint == 0 {
status = 1
} else if statusint == 1 {
status = 0
}
memberids = append(memberids, memberid)
}
pageno := c.PostForm("page")
var url string
if pageno != "" {
url = "/admin/usergroup?page=" + pageno
} else {
url = "/admin/usergroup/"
}
userid := c.GetInt("userid")
permisison, perr := NewAuth.IsGranted("Members Group", auth.Update, TenantId)
if perr != nil {
ErrorLog.Printf("multi group status authorization error :%s", perr)
}
if !permisison {
ErrorLog.Printf("Membergroup authorization error: %s", perr)
c.Redirect(301, "/403-page")
return
}
if permisison {
_, err := MemberConfig.MultiSelectMembersgroupStatus(memberids, status, userid, TenantId)
if err != nil {
ErrorLog.Printf("multi group delete authorization error :%s", err)
c.JSON(200, gin.H{"value": false})
return
}
c.JSON(200, gin.H{"value": true, "status": status, "url": url})
}
}
func Chkmemgrphavemember(c *gin.Context) {
var (
membergrpdata []map[string]string
Membergrpids []int
)
memgrp_id, _ := strconv.Atoi(c.PostForm("id"))
if err := json.Unmarshal([]byte(c.Request.PostFormValue("membergrpids")), &membergrpdata); err != nil {
fmt.Println(err)
}
for _, val := range membergrpdata {
memberid, _ := strconv.Atoi(val["memberid"])
Membergrpids = append(Membergrpids, memberid)
}
_, err := MemberConfig.Membergroupcheckmember(memgrp_id, Membergrpids, TenantId)
if err != nil {
ErrorLog.Printf("Member group check hane Error :%s", err)
c.JSON(200, gin.H{"value": false})
return
}
c.JSON(200, gin.H{"value": true})
}
-132
View File
@@ -1,132 +0,0 @@
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/")
}
-677
View File
@@ -1,677 +0,0 @@
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
}
// ChannelId, err := ChannelConfig.DefaultChannel("default_channel", TenantId)
// if err != nil {
// fmt.Println(err)
// }
channelist, clerr := ChannelConfig.GetPermissionChannel(TenantId)
if clerr != nil {
ErrorLog.Printf(" Entry listchannel error: %s", clerr)
}
var ChannelId int
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
}
-301
View File
@@ -1,301 +0,0 @@
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()
}
-503
View File
@@ -1,503 +0,0 @@
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")
fmt.Println("print",roleisactive)
isactive, err := strconv.Atoi(roleisactive)
if err != nil {
panic(err)
}
fmt.Println("role data", rolename, permissionsid)
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*/
fmt.Println("tetetett2")
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})
}
-265
View File
@@ -1,265 +0,0 @@
package controllers
import (
"encoding/json"
"fmt"
"log"
storagecontroller "spurt-cms/storage-controller"
"strconv"
"strings"
"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,"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,
}
fmt.Println("Dha", Newuser)
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")
}
}
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})
}
-68
View File
@@ -1,68 +0,0 @@
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/")
}
-693
View File
@@ -1,693 +0,0 @@
package controllers
import (
"encoding/json"
"fmt"
"net/http"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
"github.com/spurtcms/auth"
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, webid)
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(webid, TenantId)
templatedetail, err := MenuConfig.GetTemplateById(Websitedet.TemplateId, TenantId)
if err != nil {
fmt.Println(err)
}
templatedetail.DateString = templatedetail.CreatedOn.In(TZONE).Format(Datelayout)
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, "websitedetail": 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"})
}
// 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
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)
}
}
fmt.Println(recentChannels, "channellistsdf")
menuid, _ := strconv.Atoi(c.Param("id"))
menuitemslist, err := MenuConfig.GetMenusByParentid(menuid, TenantId)
menudetails, _ := MenuConfig.GetmenyById(menuid, TenantId)
ModuleName, TabName, _ := ModuleRouteName(c)
translate, _ := TranslateHandler(c)
webid, _ := strconv.Atoi(c.Query("webid"))
var pages bool
if webid != 0 {
pages = true
}
Websitedet, _ := MenuConfig.GetWebsiteById(webid, 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, webid)
listinglist, _, err := ListingConfig.ListingsList(0, 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), "websitedetail": Websitedet, "Entrylist": Entrylist, "pagelist": pagelist, "listinglist": listinglist, "gotemplatepageheader": pages, "templatedetail": templatedetail, "recentChannels": recentChannels, "recentCourses": recentCourses, "recentForms": recentForms, "menudetails": menudetails, "menuitemslist": menuitemslist, "title": ModuleName, "Tabmenu": TabName, "translate": translate, "Menu": NewMenuController(c), "linktitle": "Menus Items", "channelist": channelist, "courselist": courseslist, "Formlist": Formlist, "menuid": menuid})
}
// CreateMenu
func CreateMenu(c *gin.Context) {
menuname := c.PostForm("menu_name")
menudesc := c.PostForm("menu_desc")
userid := c.GetInt("userid")
websiteid := c.Query("webid")
fmt.Println("websiteiddd", websiteid)
webid, _ := strconv.Atoi(c.Query("webid"))
menustatus, _ := strconv.Atoi(c.PostForm("menustatus"))
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, WebsiteId: webid, Description: menudesc, Status: menustatus, 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?webid="+websiteid)
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?webid="+websiteid)
}
func UpdateMenu(c *gin.Context) {
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")
templateid := c.Query("webid")
webid, _ := strconv.Atoi(c.Query("webid"))
menudetails := menu.MenuCreate{
MenuName: c.PostForm("menu_name"),
Description: c.PostForm("menu_desc"),
Status: menustatus,
ModifiedBy: userid,
TenantId: TenantId,
Id: menuid,
WebsiteId: webid,
}
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 templateid != "" && templateid != "0" {
if strings.Contains(url, "?") {
url += "&webid=" + templateid
} else {
url += "?webid=" + templateid
}
}
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"))
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, 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"))
fmt.Println(menuId, "menuiddd")
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", perr)
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/?webid="+webid)
}
//Menu Item Creation//
func CreateMenuItem(c *gin.Context) {
labelname := c.PostForm("menu_name")
urlpath := c.PostForm("urlpath")
parentmenuid, _ := strconv.Atoi(c.PostForm("menu_id"))
mode := c.PostForm("formmode")
mtype := c.PostForm("type")
typeid, _ := strconv.Atoi(c.PostForm("cid"))
listingsids := c.PostForm("listingsids")
userid := c.GetInt("userid")
websiteid := c.Query("webid")
webid, _ := strconv.Atoi(websiteid)
if urlpath == "" && mtype == "channel" {
urlpath = "/channel/" + labelname
} else if urlpath == "/listings/" {
urlpath = "/listings/" + strings.ToLower(strings.ReplaceAll(labelname, " ", "-"))
mtype = "listings"
}
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})
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")+"?webid="+websiteid)
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("menu_id")+"?webid="+websiteid)
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("menu_id")+"?webid="+websiteid)
} else {
c.JSON(200, menu)
}
}
func UpdateMenuItem(c *gin.Context) {
labelname := c.PostForm("menu_name")
urlpath := c.PostForm("urlpath")
urlpath = "/listings/" + strings.ToLower(strings.ReplaceAll(labelname, " ", "-"))
parentmenuid, _ := strconv.Atoi(c.PostForm("parentmenu_id"))
menuid, _ := strconv.Atoi(c.PostForm("id"))
mtype := c.PostForm("type")
typeid, _ := strconv.Atoi(c.PostForm("cid"))
userid := c.GetInt("userid")
webid, _ := strconv.Atoi(c.PostForm("webid"))
menudetails := menu.MenuCreate{
MenuName: labelname,
Status: 1,
ModifiedBy: userid,
TenantId: TenantId,
Id: menuid,
ParentId: parentmenuid,
UrlPath: urlpath,
Type: mtype,
TypeId: typeid,
WebsiteId: webid,
}
fmt.Println("checkupdate", menudetails)
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
}
updatemenu, err := MenuConfig.UpdateMenu(menudetails)
if err != nil {
c.JSON(200, false)
}
c.JSON(200, updatemenu)
}
func DeleteMenuItem(c *gin.Context) {
menuId, _ := strconv.Atoi(c.Param("id"))
fmt.Println(menuId, "menuiddd")
templateid := c.Query("webid")
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
}
var parentid int
fmt.Println("menudetadfd", menudeta.ParentId)
if menudeta.ParentId != 0 {
menudet, _ := MenuConfig.GetmenyById(menudeta.ParentId, TenantId)
if menudet.ParentId == 0 {
parentid = menudet.Id
} else {
parentid = menudet.ParentId
}
} else {
parentid = menudeta.ParentId
}
if permisison {
err := MenuConfig.DeleteMenu(menuId, userid, TenantId)
// err := MenuConfig.DeleteMenuItem(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/"+strconv.Itoa(parentid)+"?webid="+templateid)
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/"+strconv.Itoa(parentid)+"?webid="+templateid)
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/"+strconv.Itoa(parentid)+"?webid="+templateid)
}
}
-167
View File
@@ -1,167 +0,0 @@
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)
c.HTML(200, "template.html", gin.H{"csrf": csrf.GetToken(c), "tempBannerValue": tempBannerValue, "linktitle": "Next.js Templates", "Menu": menu, "translate": translate, "SettingsHead": true, "title": "Channels", "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, "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) {
fmt.Println("Dhanush")
c.HTML(200, "template.html", gin.H{"Name": "Dhanush"})
}
-829
View File
@@ -1,829 +0,0 @@
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)
}
fmt.Println("role", roles)
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")
fmt.Println("username", 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"))
fmt.Println("userId", 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)
}
fmt.Println("userDetails", userDetails)
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")
fmt.Println("reapt", userid, username, email, number)
_, 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})
}
-513
View File
@@ -1,513 +0,0 @@
package controllers
import (
"bytes"
"errors"
"fmt"
"html/template"
"net/http"
"os"
"spurt-cms/models"
"strconv"
"strings"
"github.com/dgrijalva/jwt-go"
"github.com/gin-gonic/gin"
chn "github.com/spurtcms/channels"
"github.com/spurtcms/courses"
"github.com/spurtcms/menu"
"golang.org/x/net/html"
"gorm.io/gorm"
)
var (
ErrorOtpExpiry = errors.New("otp expired")
ErrorInvalidOTP = errors.New("invalid OTP")
)
type UserInfo struct {
Email string `json:"email"`
Name string `json:"name"`
GivenName string `json:"given_name"`
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
}
type WebAuth struct {
UserId int
ExpiryTime int
ExpiryFlg bool
SecretKey string
DB *gorm.DB
AuthFlg bool
PermissionFlg bool
RoleId int
RoleName string
DataAccess int
}
func NewWebsitePage(c *gin.Context) {
TENANTID := os.Getenv("TENANTID")
WebsiteLoad(c, TENANTID, "")
}
func WebsiteLoad(c *gin.Context, Tenantid, subdomain string) {
// tag := c.Query("tag")
var website menu.TblWebsite
if Tenantid == "1" {
website, _ = MenuConfig.GetWebsiteById(1, "1")
} else {
website, _ = MenuConfig.GetWebsiteByName(subdomain)
}
if website.Id == 0 {
c.HTML(404, "nodata.html", nil)
c.Abort()
return
}
User, _, _ := NewTeamWP.GetUserById(website.CreatedBy, []int{})
templatedet, _ := MenuConfig.GetTemplateById(website.TemplateId, website.TenantId)
menulist, _, _ := MenuConfig.MenuList(100, 0, menu.Filter{}, User.TenantId, website.Id)
var newmenulist []menu.TblMenus
var parentid int
var menuitemslist []menu.TblMenus
for _, val := range menulist {
if val.Status == 1 {
parentid = val.Id
}
}
menuitemslist, err := MenuConfig.GetMenusByParentid(parentid, User.TenantId)
if err != nil {
fmt.Println(err)
}
for _, val := range menuitemslist {
if val.ParentId != 0 {
newmenulist = append(newmenulist, val)
}
}
var (
limt, offset, Count int
)
pageno, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
Location := strings.TrimSpace(c.Query("Location"))
Title := strings.TrimSpace(c.Query("Title"))
template_name := strings.ToLower(templatedet.TemplateName)
template_name = strings.ReplaceAll(template_name, " ", "_")
switch template_name {
case "content_chronicle":
limt = 12
case "content_Verse":
limt = 15
case "support_sphere":
limt = 0
default:
limt = Limit
}
if pageno != 0 {
offset = (pageno - 1) * limt
}
var chnentry []chn.Tblchannelentries
c.Set("menulist", newmenulist)
if template_name == "jobs" {
entries, _, count, _ := ChannelConfigWP.FlexibleChannelEntriesList(
chn.EntriesInputs{
Status: "Published",
ChannelName: "Jobs",
Limit: limt,
Offset: offset,
GetAdditionalFields: true,
Title: Title,
Location: Location,
TenantId: User.TenantId,
},
)
Count = count
for i := range entries {
entries[i].CreatedDate = entries[i].CreatedOn.In(TZONE).Format("Jan 2 2006")
if entries[i].ProfileImagePath != "" {
entries[i].ProfileImagePath = "/image-resize?name=" + entries[i].ProfileImagePath
}
entries[i].Description = StripHTML(entries[i].Description)
categoryid, _ := strconv.Atoi(entries[i].CategoriesId)
categorydetails, _ := CategoryConfig.GetSubCategoryDetails(categoryid, User.TenantId)
entries[i].CategoryGroup = categorydetails.CategoryName
channelinfo, _, _ := ChannelConfigWP.GetChannelsById(entries[i].ChannelId, Tenantid)
entries[i].ChannelName = channelinfo.ChannelName
}
chnentry = entries
} else if template_name != "support_sphere" {
for _, val := range newmenulist {
if val.TypeId != 0 {
var entries []chn.Tblchannelentries
var count int
entries, _, count, _ = ChannelConfigWP.ChannelEntriesList(
chn.Entries{
ChannelId: val.TypeId,
Status: "Published",
Limit: limt - len(chnentry),
Offset: offset,
},
User.TenantId,
)
Count = count
for i := range entries {
entries[i].CreatedDate = entries[i].CreatedOn.In(TZONE).Format("Jan 2 2006")
if entries[i].ProfileImagePath != "" {
entries[i].ProfileImagePath = "/image-resize?name=" + entries[i].ProfileImagePath
}
entries[i].Description = StripHTML(entries[i].Description)
categoryid, _ := strconv.Atoi(entries[i].CategoriesId)
categorydetails, _ := CategoryConfig.GetSubCategoryDetails(categoryid, User.TenantId)
entries[i].CategoryGroup = categorydetails.CategoryName
}
chnentry = append(chnentry, entries...)
if len(chnentry) >= limt {
chnentry = chnentry[:limt]
break
}
}
}
} else {
for i := range newmenulist {
val := &newmenulist[i]
if val.TypeId != 0 {
entries, _, _, _ := ChannelConfigWP.ChannelEntriesList(
chn.Entries{
ChannelId: val.TypeId,
Status: "Published",
},
User.TenantId,
)
val.Count = len(entries)
if len(entries) > 3 {
entries = entries[:3]
}
chnentry = append(chnentry, entries...)
}
}
}
batchSize := 4
var batches [][]chn.Tblchannelentries
for i := 0; i < len(chnentry); i += batchSize {
end := i + batchSize
if end > len(chnentry) {
end = len(chnentry)
}
batch := chnentry[i:end]
batches = append(batches, batch)
}
var login bool
session, _ := Store.Get(c.Request, os.Getenv("SESSION_KEY"))
tkn, ok := session.Values["token"].(string)
if !ok || tkn == "" {
login = true
}
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)
}
var paginationendcount = len(chnentry) + offset
paginationstartcount := offset + 1
Previous, Next, PageCount, Page := Pagination(pageno, int(Count), limt)
UserDetailsFunction(c)
memberdet, _ := c.Get("userdetails")
// Parse templates
tmpl, err := template.ParseFiles("websites/themes/"+template_name+"/layouts/partials/header.html", "websites/themes/"+template_name+"/layouts/partials/footer.html", "websites/themes/"+template_name+"/layouts/partials/head.html", "websites/themes/"+template_name+"/layouts/_default/content_list.html")
if err != nil {
fmt.Println(err, "templateerr")
}
data := gin.H{"Pagination": PaginationData{
NextPage: pageno + 1,
PreviousPage: pageno - 1,
TotalPages: PageCount,
TwoAfter: pageno + 2,
TwoBelow: pageno - 2,
ThreeAfter: pageno + 3}, "memberdet": memberdet, "menulist": newmenulist, "searchlist": chnentry, "login": login, "template_name": c.Query("template_name"), "seodetail": seodetail, "settingsdetail": settingsdetail, "Count": Count, "Previous": Previous, "Next": Next, "PageCount": PageCount, "CurrentPage": pageno, "Page": Page, "Limit": limt, "Paginationendcount": paginationendcount, "Paginationstartcount": paginationstartcount, "Home": "Home"}
CourseList, err := TemplateCourseList(limt, offset, User.TenantId)
if err != nil {
fmt.Println(err)
}
switch template_name {
case "content_chronicle":
data["Entries"] = batches
case "support_sphere":
data["Entries"] = chnentry
case "courses":
for _, val := range newmenulist {
if val.SlugName == "all-courses" {
data["course"] = CourseList
}
}
case "ai_templates":
// var ids []string
// for _, val := range newmenulist {
// ids = append(ids, val.ListingsIds)
// }
// allIds := strings.Join(ids, ",")
// listingIds := strings.Split(allIds, ",")
// listings, _ := ListingConfig.GetListingsByIds(listingIds, tag, User.TenantId)
// data["listingslist"] = listings
var homeurl string
for index, val := range newmenulist {
if index == 0 {
homeurl = val.UrlPath
}
}
data["homeurl"] = homeurl
default:
data["entries"] = chnentry
}
RenderTemplate(c, tmpl, "content_list.html", data)
}
func TemplateCourseList(limit int, offset int, tenantid string) ([]courses.TblCourses, error) {
var CourseList []courses.TblCourses
var filteredCoursesList []courses.TblCourses
courseslist, _, err := CoursesConfig.CoursesList(limit, offset, courses.Filter{}, tenantid)
for _, val := range courseslist {
if val.Status == 1 {
filteredCoursesList = append(filteredCoursesList, val)
}
}
if err != nil {
fmt.Println(err)
return []courses.TblCourses{}, err
}
for _, value := range filteredCoursesList {
if value.ImagePath != "" {
value.ImagePath = "/image-resize?name=" + value.ImagePath
}
if value.ProfileImagePath != "" {
value.ProfileImagePath = "/image-resize?name=" + value.ProfileImagePath
}
var first = value.FirstName
var last = value.LastName
var firstn string
var lastn string
if value.FirstName != "" {
firstn = strings.ToUpper(first[:1])
}
if value.LastName != "" {
lastn = strings.ToUpper(last[:1])
}
value.NameString = firstn + lastn
if !value.ModifiedOn.IsZero() {
value.DateString = value.ModifiedOn.In(TZONE).Format(Datelayout)
} else {
value.DateString = value.CreatedOn.In(TZONE).Format(Datelayout)
}
value.CreatedTime = value.CreatedOn.In(TZONE).Format(Datelayout)
CourseList = append(CourseList, value)
}
return CourseList, nil
}
func GetTemplateName(c *gin.Context) string {
templateName := c.Query("template_name")
var baseName string
if subdomain := strings.Split(c.Request.Host, ".")[0]; subdomain != "" &&
subdomain != "lvh" && subdomain != "localhost:8000" && subdomain != "spurtcms" {
User, err := models.GetuserBySubdomain(subdomain)
if err == nil {
templatedetails, err := MenuConfig.GetTemplateById(User.GoTemplateDefault, User.TenantId)
if err == nil && templateName == "" {
baseName = templatedetails.TemplateName
}
}
}
if templateName != "" {
baseName = templateName
}
baseName = strings.ToLower(baseName)
baseName = strings.ReplaceAll(baseName, " ", "_")
return baseName
}
func RenderTemplate(c *gin.Context, tmpl *template.Template, templateName string, data interface{}) {
err := tmpl.ExecuteTemplate(c.Writer, templateName, data)
if err != nil {
c.String(http.StatusInternalServerError, err.Error())
}
}
func StripHTML(input string) string {
doc, err := html.Parse(strings.NewReader(input))
if err != nil {
return input
}
var buf bytes.Buffer
var f func(*html.Node)
f = func(n *html.Node) {
if n.Type == html.TextNode {
buf.WriteString(n.Data)
}
for c := n.FirstChild; c != nil; c = c.NextSibling {
f(c)
}
}
f(doc)
return buf.String()
}
func LogoutTime(userid int) {
userdata, _, _ := NewTeam.GetUserById(userid, []int{})
if !userdata.LastLogin.IsZero() {
Lastactive := userdata.LastLogin.In(TZONE).Format(Datelayout)
Lastlogin[userdata.Id] = Lastactive
} else {
Lastlogin[userdata.Id] = "--"
}
}
func UserDetailsFunction(c *gin.Context) {
session, _ := Store.Get(c.Request, "spurttemplate")
tkn := session.Values["token"]
if tkn != nil {
token := tkn.(string)
secret := os.Getenv("JWT_SECRET")
Claims := jwt.MapClaims{}
_, 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)
}
}
userIDFloat, ok := Claims["member_id"].(float64)
if !ok {
fmt.Println(ok, "err")
}
userid := int(userIDFloat)
tenantid, ok := Claims["tenant_id"].(string)
if !ok {
fmt.Println(ok, "err")
return
}
fmt.Printf("userid: %d, tenantid: %d\n", userid)
member, _ := MemberConfig.GetMemberAndProfileData(userid, "", 0, "", tenantid)
var firstn = strings.ToUpper(member.FirstName[:1])
var lastn string
if member.LastName != "" {
lastn = strings.ToUpper(member.LastName[:1])
}
member.NameString = firstn + lastn
member.NameString = firstn + lastn
if err == nil && member.Id != 0 {
c.Set("userdetails", member)
}
}
}
-105
View File
@@ -1,105 +0,0 @@
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/spurtcms/auth v0.0.44
github.com/spurtcms/categories v0.0.27
github.com/spurtcms/channels v0.0.107
github.com/spurtcms/forms-builders v0.0.27
github.com/spurtcms/member v0.0.26
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.33.0
golang.org/x/net v0.35.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.8
github.com/spurtcms/membership v0.0.26
github.com/spurtcms/menu v0.0.32
gopkg.in/yaml.v2 v2.4.0
)
require github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
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/gorilla/websocket v1.5.0 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // 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.23.0 // indirect
golang.org/x/sync v0.11.0 // indirect
golang.org/x/sys v0.30.0 // indirect
golang.org/x/text v0.22.0 // indirect
golang.org/x/tools v0.30.0 // indirect
google.golang.org/protobuf v1.36.5 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
-292
View File
@@ -1,292 +0,0 @@
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/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.27 h1:3fL5bC/RsAgTT6u14bspXy4ovWZkLJqrY2WIVubWA0Q=
github.com/spurtcms/categories v0.0.27/go.mod h1:5YjyFKoY9vaGxtCCkvcZuA7jFcWnn1dadZ+e4C8OTSs=
github.com/spurtcms/channels v0.0.107 h1:Fnc3WLnrUgeph9bFD5I/0Hwlp+aUk7906W0zMItmsdg=
github.com/spurtcms/channels v0.0.107/go.mod h1:ppuno0wAKoL1F3V+/K1uykkXoL2I1+Ggjpc4gwuANZg=
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.27 h1:FNAGn4V3RS2+phDeCoe5brDtZwoUgXTdLoIBHJ/LbQo=
github.com/spurtcms/forms-builders v0.0.27/go.mod h1:MD7DOEu99VApmq2/Gl2DOSXaIMO22sLWh+OAW5JpWm0=
github.com/spurtcms/listing v0.0.8 h1:Vg80tRVlRbFFgDfMj2k5Y00cGGE4PlwtHANeAd93BZM=
github.com/spurtcms/listing v0.0.8/go.mod h1:eJPJsnNPSGz6tCoon7yKfAhNKDTctr9rutM17Me4u0E=
github.com/spurtcms/member v0.0.26 h1:cdRe12zlH2A86YdC8w2Xyu69DVav6CeqFce3hqMJ9vM=
github.com/spurtcms/member v0.0.26/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.32 h1:9BftEJOkB5F0pX1nf669CMOnfoW232arcEgprhKHoXw=
github.com/spurtcms/menu v0.0.32/go.mod h1:7PlQpDFYLQh3jg7Ys419BBHy+86DDtQqbL1oN6uyr50=
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/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.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus=
golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM=
golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
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.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
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.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY=
golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY=
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=
-171
View File
@@ -1,171 +0,0 @@
package controller
import (
"context"
"spurt-cms/graphql/info"
"spurt-cms/graphql/model"
"spurt-cms/models"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
func CategoryList(ctx context.Context, categoryFilter *model.CategoryFilter, commonFilter *model.Filter) (*model.CategoryDetails, error) {
c, ok := ctx.Value(GinContext).(*gin.Context)
if !ok {
ErrorLog.Printf("%v", info.ErrGinCtx)
return &model.CategoryDetails{}, info.ErrGinCtx
}
var (
limit, offset, categoryGroupId, hierarchyLevel int
checkEntriesPresence, excludeGroup, excludeParent, exactLevelOnly bool
categoryGroupSlug,channelSlug string
finalCategoriesList []model.Category
)
if commonFilter != nil {
if commonFilter.Limit.IsSet() {
limit = *commonFilter.Limit.Value()
}
if commonFilter.Offset.IsSet() {
offset = *commonFilter.Offset.Value()
}
}
if categoryFilter != nil {
if categoryFilter.CategoryGroupID.IsSet() {
categoryGroupId = *categoryFilter.CategoryGroupID.Value()
}
if categoryFilter.HierarchyLevel.IsSet() {
hierarchyLevel = *categoryFilter.HierarchyLevel.Value()
}
if categoryFilter.CheckEntriesPresence.IsSet() && *categoryFilter.CheckEntriesPresence.Value(){
checkEntriesPresence = *categoryFilter.CheckEntriesPresence.Value()
}
if categoryFilter.ExcludeGroup.IsSet() && *categoryFilter.ExcludeGroup.Value() {
excludeGroup = *categoryFilter.ExcludeGroup.Value()
}
if categoryFilter.ExcludeParent.IsSet() && *categoryFilter.ExcludeParent.Value() {
excludeParent = *categoryFilter.ExcludeParent.Value()
}
if categoryFilter.CategoryGroupSlug.IsSet() {
categoryGroupSlug = *categoryFilter.CategoryGroupSlug.Value()
}
if categoryFilter.ExactLevelOnly.IsSet() && *categoryFilter.ExactLevelOnly.Value(){
exactLevelOnly = *categoryFilter.ExactLevelOnly.Value()
}
if categoryFilter.ChannelSlug.IsSet() && *categoryFilter.ChannelSlug.Value() != ""{
channelSlug = *categoryFilter.ChannelSlug.Value()
}
}
tenantDetails, err := GetTenantDetails(c)
if err != nil {
ErrorLog.Printf("%v", info.ErrFetchTenantDetails)
c.AbortWithStatus(500)
return &model.CategoryDetails{}, info.ErrFetchTenantDetails
}
categoryListLocal, count, err := CategoryInstance.CategoryList(limit, offset, categoryGroupId, hierarchyLevel,tenantDetails.TenantId, checkEntriesPresence, excludeGroup, excludeParent,exactLevelOnly,channelSlug,categoryGroupSlug)
if err != nil {
if err == gorm.ErrRecordNotFound {
return &model.CategoryDetails{}, nil
}
ErrorLog.Printf("%v", info.ErrFetchCategoryDetails)
c.AbortWithStatus(500)
return &model.CategoryDetails{}, info.ErrFetchCategoryDetails
}
for _, categoryList := range categoryListLocal {
cateModifiedOn := categoryList.ModifiedOn
cateModifiedBy := categoryList.ModifiedBy
var localCategoryList model.Category
localCategoryList.CategoryName = categoryList.CategoryName
localCategoryList.CategorySlug = categoryList.CategorySlug
localCategoryList.CreatedBy = categoryList.CreatedBy
localCategoryList.CreatedOn = categoryList.CreatedOn
localCategoryList.Description = categoryList.Description
localCategoryList.ID = categoryList.Id
localCategoryList.ImagePath = categoryList.ImagePath
localCategoryList.ModifiedBy = &cateModifiedBy
localCategoryList.ModifiedOn = &cateModifiedOn
localCategoryList.ParentID = categoryList.ParentId
localCategoryList.TenantID = categoryList.TenantId
finalCategoriesList = append(finalCategoriesList, localCategoryList)
}
return &model.CategoryDetails{Categorylist: finalCategoriesList, Count: count}, nil
}
func GeneralInfo(ctx context.Context, id *string) (*model.GeneralInfo, error) {
c, ok := ctx.Value(GinContext).(*gin.Context)
if !ok {
ErrorLog.Printf("%v", info.ErrGinCtx)
return nil, info.ErrGinCtx
}
var tenantid string
if *id != "" {
tenantid = *id
}
// models.GetGeneralSettings(tenantid)
tblgeneralsetting, err :=models.GetGeneralSettings(tenantid)
if err != nil {
if err == gorm.ErrRecordNotFound {
c.AbortWithStatus(400)
return nil, err
}
ErrorLog.Printf("%v", err)
c.AbortWithStatus(500)
return nil, err
}
generalInfo:=model.GeneralInfo{
CompanyName: tblgeneralsetting.CompanyName,
LogoPath: tblgeneralsetting.LogoPath,
ExpandLogoPath: tblgeneralsetting.ExpandLogoPath,
TenantID: tenantid,
}
return &generalInfo,nil
}
File diff suppressed because it is too large Load Diff
-450
View File
@@ -1,450 +0,0 @@
package controller
import (
"bytes"
"fmt"
"image"
"image/jpeg"
"image/png"
"log"
"os"
"path"
"spurt-cms/graphql/info"
logPkg "spurt-cms/graphql/logger"
"spurt-cms/graphql/model"
"spurt-cms/models"
"strconv"
"strings"
"unicode/utf8"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/gin-gonic/gin"
"github.com/joho/godotenv"
"github.com/nfnt/resize"
newauth "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/member"
membership "github.com/spurtcms/membership"
"github.com/spurtcms/team"
role "github.com/spurtcms/team-roles"
)
type Key string
type Header string
var (
GinContext Key
ErrorLog *log.Logger
NewAuth *newauth.Auth
NewRole *role.PermissionConfig
NewRoleWP *role.PermissionConfig
ChannelConfig *chn.Channel
ChannelConfigWP *chn.Channel
NewTeam *team.Teams
NewTeamWP *team.Teams
MemberInstance *member.Member
MembershipConfigWP *membership.Membership
MemberAuthInstance *member.Member
CategoryInstance *categories.Categories
CategoryAuthInstance *categories.Categories
MaxChunkLength int = 8388573 //max size of a string response
FormConfigwp *forms.Formbuilders
CoursesInstance *courses.Courses
)
func init() {
if err := godotenv.Load(); err != nil {
ErrorLog.Printf("%v", info.ErrLoadEnv)
log.Fatal(err)
}
ErrorLog = logPkg.ErrorLog()
AuthConfig()
GetTeamInstance()
GetTeamInstanceWithoutPermission()
GetChannelInstance()
GetChannelInstanceWithoutPermission()
GetMemberInstance()
GetMemberAuthInstance()
GetCategoryInstance()
GetCategoryAuthInstance()
GetMembershipInstanceWithoutPermission()
GetFormInstance()
GetCoursesInstance()
}
// AuthCofing
func AuthConfig() *newauth.Auth {
NewAuth = newauth.AuthSetup(newauth.Config{
SecretKey: os.Getenv("JWT_SECRET"),
DB: models.DB,
// DataBaseType: os.Getenv("DATABASE_TYPE"),
})
return NewAuth
}
// channel config
func GetChannelInstance() *chn.Channel {
ChannelConfig = chn.ChannelSetup(chn.Config{
DB: models.DB,
AuthEnable: false,
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: models.DB,
AuthEnable: false,
PermissionEnable: false,
Auth: NewAuth,
// DataBaseType: os.Getenv("DATABASE_TYPE"),
})
return ChannelConfigWP
}
// channel config without permission
func GetMembershipInstanceWithoutPermission() *membership.Membership {
MembershipConfigWP = membership.MembershipSetup(membership.Config{
DB: models.DB,
AuthEnable: false,
PermissionEnable: false,
Auth: NewAuth,
// DataBaseType: os.Getenv("DATABASE_TYPE"),
})
return MembershipConfigWP
}
// TeamConfig
func GetTeamInstance() *team.Teams {
NewTeam = team.TeamSetup(team.Config{
DB: models.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: models.DB,
AuthEnable: false,
PermissionEnable: false,
Auth: NewAuth,
// DataBaseType: os.Getenv("DATABASE_TYPE"),
})
return NewTeamWP
}
// Member Instance without Auth
func GetMemberInstance() *member.Member {
MemberInstance = member.MemberSetup(member.Config{
DB: models.DB,
AuthEnable: false,
PermissionEnable: false,
Auth: NewAuth,
})
return MemberInstance
}
func GetMemberAuthInstance() *member.Member {
MemberAuthInstance = member.MemberSetup(member.Config{
DB: models.DB,
AuthEnable: true,
PermissionEnable: true,
Auth: NewAuth,
})
return MemberAuthInstance
}
func GetTenantDetails(c *gin.Context) (team.TblUser, error) {
tenantData, ok := c.Get("tenantDetails")
if !ok {
return team.TblUser{}, info.ErrFetchTenantDetails
}
return tenantData.(team.TblUser), nil
}
func GetCategoryInstance() *categories.Categories {
CategoryInstance = categories.CategoriesSetup(categories.Config{
DB: models.DB,
AuthEnable: false,
PermissionEnable: false,
Auth: NewAuth,
})
return CategoryInstance
}
func GetCategoryAuthInstance() *categories.Categories {
CategoryAuthInstance = categories.CategoriesSetup(categories.Config{
DB: models.DB,
AuthEnable: true,
PermissionEnable: true,
Auth: NewAuth,
})
return CategoryAuthInstance
}
func GetFormInstance() *forms.Formbuilders {
FormConfigwp = forms.FormSetup(forms.Config{
DB: models.DB,
AuthEnable: false,
PermissionEnable: false,
Auth: NewAuth,
})
return FormConfigwp
}
func GetCoursesInstance() *courses.Courses {
CoursesInstance = courses.CoursesSetup(courses.Config{
DB: models.DB,
AuthEnable: true,
PermissionEnable: false,
Auth: NewAuth,
})
return CoursesInstance
}
func ImageResize(c *gin.Context) {
fileName := c.Query("name")
filePath := c.Query("path")
extension := path.Ext(fileName)
var storageType model.TblStorageTypes
err := model.GetStorageType(models.DB, &storageType)
if err != nil {
fmt.Println(err)
c.AbortWithError(500, fmt.Errorf("%v-%v", info.ErrGetAwsCreds, err))
return
}
var byteData []byte
rawObject, err := GetObjectFromS3(storageType.Aws, strings.TrimSuffix(filePath, "/")+"/"+fileName)
if err != nil {
fmt.Println(err)
c.AbortWithError(500, fmt.Errorf("%v-%v", info.ErrGetImage, err))
return
}
buf := new(bytes.Buffer)
buf.ReadFrom(rawObject.Body)
byteData = buf.Bytes()
extType := strings.Trim(extension, ".")
if c.Query("width") == "" || c.Query("height") == "" {
if extType == "svg" {
extType = "svg+xml"
}
c.Data(200, "image/"+extType, byteData)
return
}
width, _ := strconv.ParseUint(c.Query("width"), 10, 64)
height, _ := strconv.ParseUint(c.Query("height"), 10, 64)
Image, _, err := image.Decode(bytes.NewReader(byteData))
if err != nil {
fmt.Println(err)
c.AbortWithError(500, fmt.Errorf("%v-%v", info.ErrDecodeImg, err))
return
}
newImage := resize.Resize(uint(width), uint(height), Image, resize.Lanczos3)
if extension == ".png" {
err = png.Encode(c.Writer, newImage)
if err != nil {
fmt.Println(err)
c.AbortWithError(500, fmt.Errorf("%v-%v", info.ErrImageResize, err))
return
}
}
if extension == ".jpeg" || extension == ".jpg" {
err = jpeg.Encode(c.Writer, newImage, nil)
if err != nil {
fmt.Println(err)
c.AbortWithError(500, fmt.Errorf("%v-%v", info.ErrImageResize, err))
return
}
}
}
func GetObjectFromS3(AwsCredentials map[string]interface{}, key string) (*s3.GetObjectOutput, error) {
session := CreateAwsSession(AwsCredentials)
s3Svc := CreateS3Session(session)
awsBucket := AwsCredentials["BucketName"].(string)
rawObject, err := s3Svc.GetObject(&s3.GetObjectInput{
Bucket: aws.String(awsBucket),
Key: aws.String(key),
})
if err != nil {
fmt.Printf("Error get object %s: %s\n", key, err)
return nil, err
}
return rawObject, nil
}
// create session
func CreateS3Session(awsSession *session.Session) (ses *s3.S3) {
svc := s3.New(awsSession)
return svc
}
func CreateAwsSession(AwsCredentials map[string]interface{}) *session.Session {
var awsId, awsKey, awsRegion string
if AwsCredentials != nil {
awsId = AwsCredentials["AccessId"].(string)
awsKey = AwsCredentials["AccessKey"].(string)
awsRegion = AwsCredentials["Region"].(string)
}
// The session the S3 Uploader will use
sess := session.Must(session.NewSession(
&aws.Config{
Region: &awsRegion,
Credentials: credentials.NewStaticCredentials(awsId, awsKey, ""),
},
))
return sess
}
func FetchChunkData(fullLengthData string) []string {
var chunks []string
dataLen := utf8.RuneCountInString(fullLengthData)
for i := 0; i < dataLen; i += MaxChunkLength {
var chunk string
switch {
case i+MaxChunkLength > dataLen:
chunk = fullLengthData[i:dataLen]
default:
chunk = fullLengthData[i : i+MaxChunkLength]
}
chunks = append(chunks, chunk)
}
return chunks
}
-171
View File
@@ -1,171 +0,0 @@
package controller
import (
"context"
"spurt-cms/graphql/info"
"spurt-cms/graphql/model"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
//CourseList Api
func CourseList(ctx context.Context, tenantId *string, status *int, categoryid *int) (*model.CourseLists, error) {
c, ok := ctx.Value(GinContext).(*gin.Context)
if !ok {
ErrorLog.Printf("%v", info.ErrGinCtx)
return &model.CourseLists{}, info.ErrGinCtx
}
var tenantid string
if *tenantId != "" {
tenantid = *tenantId
}
var Status int
if *status != 0 {
Status = *status
}
var CategoryId int
if *categoryid != 0 {
CategoryId = *categoryid
}
courselist, count, err := CoursesInstance.CourseList(Status, tenantid, CategoryId)
if err != nil {
if err == gorm.ErrRecordNotFound {
c.AbortWithStatus(400)
return nil, err
}
ErrorLog.Printf("%v", err)
c.AbortWithStatus(500)
return nil, err
}
var finalCourseList []model.Course
for _, val := range courselist {
value := model.Course{
ID: val.Id,
Title: val.Title,
Description: val.Description,
ImageName: val.ImageName,
ImagePath: val.ImagePath,
Category: val.CategoryId,
}
finalCourseList = append(finalCourseList, value)
}
list := model.CourseLists{
Courselist: finalCourseList,
Count: int(count),
}
return &list, nil
}
//CourseDetails Api
func CourseDetails(ctx context.Context, tenantId *string, courseId *int) (*model.CourseDetails, error) {
c, ok := ctx.Value(GinContext).(*gin.Context)
if !ok {
ErrorLog.Printf("%v", info.ErrGinCtx)
return &model.CourseDetails{}, info.ErrGinCtx
}
var tenantid string
if *tenantId != "" {
tenantid = *tenantId
}
var CourseId int
if *courseId != 0 {
CourseId = *courseId
}
sectionlist, serr := CoursesInstance.SectionList(CourseId, tenantid)
if serr != nil {
if serr == gorm.ErrRecordNotFound {
c.AbortWithStatus(400)
return nil, serr
}
ErrorLog.Printf("%v", serr)
c.AbortWithStatus(500)
return nil, serr
}
var FinalSectionList []model.Sections
for _, sectionValue := range sectionlist {
SectionList := model.Sections{
ID: sectionValue.Id,
CourseID: sectionValue.CourseId,
Title: sectionValue.Title,
Content: sectionValue.Content,
OrderIndex: sectionValue.OrderIndex,
TenantID: sectionValue.TenantId,
}
FinalSectionList = append(FinalSectionList, SectionList)
}
lessonlist, lerr := CoursesInstance.LessonList(CourseId, tenantid)
if lerr != nil {
if lerr == gorm.ErrRecordNotFound {
c.AbortWithStatus(400)
return nil, lerr
}
ErrorLog.Printf("%v", lerr)
c.AbortWithStatus(500)
return nil, lerr
}
var FinalLessonList []model.Lesson
for _, lessonValue := range lessonlist {
LessonList := model.Lesson{
ID: lessonValue.Id,
CourseID: lessonValue.CourseId,
SectionID: lessonValue.SectionId,
Title: lessonValue.Title,
Content: lessonValue.Content,
EmbedLink: lessonValue.EmbedLink,
FileName: lessonValue.FileName,
FilePath: lessonValue.FilePath,
LessonType: lessonValue.LessonType,
OrderIndex: lessonValue.OrderIndex,
TenantID: lessonValue.TenantId,
}
FinalLessonList = append(FinalLessonList, LessonList)
}
return &model.CourseDetails{Lesson: FinalLessonList, Section: FinalSectionList}, nil
}
-732
View File
@@ -1,732 +0,0 @@
package controller
import (
"context"
"errors"
"fmt"
"net/http"
"os"
"spurt-cms/controllers"
"spurt-cms/graphql/info"
"spurt-cms/graphql/model"
storagecontroller "spurt-cms/storage-controller"
"strconv"
"strings"
"sync"
"github.com/gin-gonic/gin"
"github.com/golang-jwt/jwt"
"github.com/spurtcms/member"
"github.com/spurtcms/team"
"golang.org/x/crypto/bcrypt"
"gorm.io/gorm"
)
func MemberRegister(ctx context.Context, memberData *model.MemberDetails, arguments *model.MemberArguments) (bool, error) {
c, ok := ctx.Value(GinContext).(*gin.Context)
if !ok {
ErrorLog.Printf("%v", info.ErrGinCtx)
c.AbortWithStatus(500)
return false, info.ErrGinCtx
}
tenantId := memberData.TenantID
createdBy := memberData.UserID
fmt.Println("userid:", createdBy, tenantId)
var (
memberSettings member.TblMemberSetting
err error
)
memberSettings, err = MemberInstance.GetMemberSettings(tenantId)
if err != nil {
return false, err
}
if memberSettings.AllowRegistration == 0 {
return false, info.ErrMemberRegisterPerm
}
var memberDetails member.TblMember
if memberData.Mobile.IsSet() {
memberDetails.MobileNo = *memberData.Mobile.Value()
}
if memberData.LastName.IsSet() {
memberDetails.LastName = *memberData.LastName.Value()
}
if memberData.Password != "" {
memberDetails.Password = memberData.Password
}
if memberData.Username.IsSet() {
memberDetails.Username = *memberData.Username.Value()
isExist, err := MemberInstance.CheckNameInMember(0, *memberData.Username.Value(), tenantId)
if isExist || err == nil {
err = errors.New("member already exists")
c.AbortWithError(422, err)
return isExist, err
}
}
if memberData.Email != "" {
memberDetails.Email = memberData.Email
isExist, err := MemberInstance.CheckEmailInMember(0, memberData.Email, tenantId)
if isExist || err == nil {
err = errors.New("member already exists")
c.AbortWithError(http.StatusBadRequest, err)
return isExist, err
}
}
memberDetails.FirstName = memberData.FirstName
memberDetails.Username = strings.ToLower(memberData.FirstName)
memberDetails.IsActive = 1
memberss := member.MemberCreationUpdation{
FirstName: memberDetails.FirstName,
LastName: memberDetails.LastName,
Username: memberDetails.Username,
Email: memberDetails.Email,
Password: memberDetails.Password,
IsActive: memberDetails.IsActive,
CreatedBy: createdBy,
TenantId: tenantId,
}
members, _ := MemberInstance.CreateMember(memberss)
MemberProfile := member.MemberprofilecreationUpdation{
MemberId: members.Id,
CreatedBy: createdBy,
TenantId: tenantId,
}
merr := MemberInstance.CreateMemberProfile(MemberProfile)
if merr != nil {
ErrorLog.Printf("memberprofile create error: %s", merr)
}
return true, nil
}
func MemberLogin(ctx context.Context, memberData *model.MemberSignin) (*model.MemberCheckLoginResponse, error) {
c, ok := ctx.Value(GinContext).(*gin.Context)
if !ok {
ErrorLog.Printf("%v", info.ErrGinCtx)
c.AbortWithStatus(500)
return nil, info.ErrGinCtx
}
Email := memberData.Email
Password := memberData.Password
UserId := memberData.UserID
TenantId := memberData.TenantID
token, pass, email, _ := model.Model.CheckMemberLogin(Email, Password, UserId, TenantId)
if !email {
return &model.MemberCheckLoginResponse{
Email: false,
Message: "Login failed: invalid credentials",
Success: false,
}, nil
}
if !pass {
return &model.MemberCheckLoginResponse{
Email: true,
Password: false,
Message: "Login failed: invalid credentials",
Success: false,
}, nil
}
member, _ := MemberInstance.GetMemberAndProfileData(0, Email, 0, "", TenantId)
var firstn = strings.ToUpper(member.FirstName[:1])
var lastn string
if member.LastName != "" {
lastn = strings.ToUpper(member.LastName[:1])
}
member.NameString = firstn + lastn
member.NameString = firstn + lastn
return &model.MemberCheckLoginResponse{Email: true, Password: true, Message: "Login successful", Token: token, Success: true,
MemberDetails: &model.Members{Email: member.Email, FirstName: member.FirstName, LastName: &member.LastName, ProfileImage: &member.ProfileImage, ProfileImagePath: &member.ProfileImagePath, Mobile: &member.MobileNo, NameString: &member.NameString, ID: &member.Id}}, nil
}
func MembersList(ctx context.Context, filter *model.Filter) (*model.MembersDetails, error) {
c, ok := ctx.Value(GinContext).(*gin.Context)
if !ok {
ErrorLog.Printf("%v", info.ErrGinCtx)
return &model.MembersDetails{}, info.ErrGinCtx
}
tenantDetails, err := GetTenantDetails(c)
if err != nil {
ErrorLog.Printf("%v", info.ErrFetchTenantDetails)
c.AbortWithStatus(500)
return &model.MembersDetails{}, info.ErrFetchTenantDetails
}
var (
limit, offset int
keyword string
)
if filter != nil {
if filter.Limit.IsSet() && filter.Limit.Value() != nil {
limit = *filter.Limit.Value()
}
if filter.Offset.IsSet() && filter.Offset.Value() != nil {
offset = *filter.Offset.Value()
}
if filter.Keyword.IsSet() && filter.Keyword.Value() != nil {
keyword = *filter.Keyword.Value()
}
}
input := model.MembersListReq{
Limit: limit,
Offset: offset,
Keyword: keyword,
TenantId: tenantDetails.TenantId,
Count: true,
}
members, count, err := model.Model.MembersList(input)
if err != nil {
if err == gorm.ErrRecordNotFound {
c.AbortWithStatus(400)
return &model.MembersDetails{}, err
}
ErrorLog.Printf("%v", err)
c.AbortWithStatus(500)
return &model.MembersDetails{}, err
}
var memberlist []model.Members
for _, member := range members {
modifiedOn := member.ModifiedOn
modifiedBy := member.ModifiedBy
member := model.Members{
ID: member.ID,
FirstName: member.FirstName,
LastName: member.LastName,
Email: member.Email,
Mobile: member.Mobile,
IsActive: member.IsActive,
CreatedOn: member.CreatedOn,
CreatedBy: member.CreatedBy,
IsDeleted: member.IsDeleted,
ModifiedOn: modifiedOn,
ModifiedBy: modifiedBy,
TenantID: member.TenantID,
}
memberlist = append(memberlist, member)
}
return &model.MembersDetails{MembersList: memberlist, Count: int(count)}, nil
}
//Forgot Password API//
func ForgotPassword(ctx context.Context, memberdetails *model.MemberInfo) (*model.ForgotPasswordResponse, error) {
_, ok := ctx.Value(GinContext).(*gin.Context)
if !ok {
ErrorLog.Printf("%v", info.ErrGinCtx)
return &model.ForgotPasswordResponse{}, info.ErrGinCtx
}
member, err := MemberInstance.GetMemberAndProfileData(0, memberdetails.Email, 0, "", memberdetails.TenantID)
id := member.Id
token, _ := CreateTokenWithExpireTime(id, memberdetails.TenantID)
fmt.Println(token, "token")
if err != nil {
ErrorLog.Printf("Send Link forget password error: %s", err)
return &model.ForgotPasswordResponse{Message: "you are not registered with us", Success: false}, fmt.Errorf("you are not registered with us")
}
var url_prefix = os.Getenv("BASE_URL")
var resetpassurl = memberdetails.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": member.Username,
"resetpassword": resetpassurl + "/auth/change-password?token=" + token,
"restpassurl": resetpassurl + "/auth/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,
}
var wg sync.WaitGroup
wg.Add(1)
Chan := make(chan string, 1)
go controllers.ForgetPasswordEmail(Chan, &wg, data, member.Email, "Forgot Password", "")
close(Chan)
return &model.ForgotPasswordResponse{Message: "Mail sent successfully!", Success: true}, nil
}
//Reset Password API//
func ResetPassword(ctx context.Context, memberinfo *model.MemberResetpassInfo) (bool, error) {
_, ok := ctx.Value(GinContext).(*gin.Context)
if !ok {
ErrorLog.Printf("%v", info.ErrGinCtx)
return false, info.ErrGinCtx
}
newpass := memberinfo.NewPassword
confrimpass := memberinfo.ConfrimPassword
token := memberinfo.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 false, err
}
}
memberIDStr, ok := Claims["member_id"].(string)
if !ok {
fmt.Println("member_id is not a string")
return false, err
}
memberid, err := strconv.Atoi(memberIDStr)
if err != nil {
fmt.Println("Error converting member_id:", err)
return false, err
}
TenantidStr, ok := Claims["tenant_id"].(string)
if !ok {
return false, err
}
Tenantid := TenantidStr
getuserinfo, _ := NewTeamWP.GetTenantDetails(Tenantid)
if newpass == confrimpass {
err := MemberInstance.MemberPasswordUpdate(newpass, confrimpass, "", memberid, getuserinfo.Id, Tenantid)
if err != nil {
ErrorLog.Printf("set new password error: %s", err)
return false, err
}
} else {
return false, fmt.Errorf("password don't mismatch")
}
return true, nil
}
func CreateTokenWithExpireTime(userid int, tenantid string) (string, error) {
atClaims := jwt.MapClaims{}
atClaims["authorized"] = true
atClaims["member_id"] = (userid)
atClaims["tenant_id"] = tenantid
at := jwt.NewWithClaims(jwt.SigningMethodHS256, atClaims)
token, err := at.SignedString([]byte(os.Getenv("JWT_SECRET")))
if err != nil {
return "", err
}
return token, nil
}
// social Login //
func MemberSocialLogin(ctx context.Context, input *model.SocialLoginInput) (*model.SocialLoginResponse, error) {
c, ok := ctx.Value(GinContext).(*gin.Context)
if !ok {
ErrorLog.Printf("%v", info.ErrGinCtx)
c.AbortWithError(500, nil)
}
apiKey := c.GetHeader("ApiKey")
tenantdetails, _ := model.Model.GettenantByapikey(apiKey)
fmt.Println(apiKey, tenantdetails, "tenantdetailsss")
userinfo, _ := model.Model.GetUserbyTenantId(tenantdetails.TenantId)
memberinfo, _ := MemberInstance.GetMemberAndProfileData(0, input.Email, 0, "", tenantdetails.TenantId)
if memberinfo.Id != 0 && memberinfo.IsActive == 0 {
message := "This account is inactive. Please contact Admin."
return &model.SocialLoginResponse{Message: message}, fmt.Errorf("account is inactive")
}
var response model.SocialLoginResponse
var memid int
var username string
var lastname string
var password string
if memberinfo.Email != input.Email {
if input.Username.IsSet() && input.Username.Value() != nil {
username = *input.Username.Value()
}
if input.LastName.IsSet() && input.LastName.Value() != nil {
lastname = *input.LastName.Value()
}
if input.Password.IsSet() && input.Password.Value() != nil {
password = *input.Password.Value()
}
membergrp, err := model.Model.GetmemberGroup("default-group", tenantdetails.TenantId)
fmt.Println(membergrp, "membergrbb")
memberss := member.MemberCreationUpdation{
FirstName: input.FirstName,
LastName: lastname,
Username: username,
Email: input.Email,
Password: password,
IsActive: 1,
CreatedBy: userinfo.Id,
TenantId: tenantdetails.TenantId,
StorageType: "aws",
}
members, err := MemberInstance.CreateMember(memberss)
if err != nil {
fmt.Println("member creation error")
return &model.SocialLoginResponse{Message: "member Creation error"}, err
}
MemberProfile := member.MemberprofilecreationUpdation{
MemberId: members.Id,
CreatedBy: userinfo.Id,
TenantId: tenantdetails.TenantId,
}
merr := MemberInstance.CreateMemberProfile(MemberProfile)
if merr != nil {
ErrorLog.Printf("memberprofile create error: %s", merr)
return &model.SocialLoginResponse{Message: "memberprofile create error"}, merr
}
memid = members.Id
} else {
memid = memberinfo.Id // Existing user's ID
}
successMessage := "Successfully Logged In"
token, _ := CreateTokenWithExpireTime(memid, tenantdetails.TenantId)
response.Token = token
response.Message = successMessage
response.Userid = memid
return &response, nil
}
//Member Profile Details//
func MemberProfileDetails(ctx context.Context, id *int) (*model.Members, error) {
c, ok := ctx.Value(GinContext).(*gin.Context)
if !ok {
ErrorLog.Printf("%v", info.ErrGinCtx)
c.AbortWithError(500, nil)
}
var memberid int
var memdet model.Members
if id != nil {
memberid = *id
}
if memberid == 0 {
err := errors.New("unauthorized access")
c.AbortWithError(http.StatusUnauthorized, err)
return &model.Members{}, err
}
tenantData, ok := c.Get("tenantDetails")
tenantdetails := tenantData.(team.TblUser)
memberdetails, err := MemberInstance.GetMemberAndProfileData(memberid, "", 0, "", tenantdetails.TenantId)
if err != nil {
return &model.Members{}, err
}
var firstn = strings.ToUpper(memberdetails.FirstName[:1])
var lastn string
if memberdetails.LastName != "" {
lastn = strings.ToUpper(memberdetails.LastName[:1])
}
memberdetails.NameString = firstn + lastn
memberdetails.NameString = firstn + lastn
memdet = model.Members{
ID: &memberdetails.Id,
FirstName: memberdetails.FirstName,
LastName: &memberdetails.LastName,
Username: &memberdetails.Username,
ProfileImage: &memberdetails.ProfileImage,
ProfileImagePath: &memberdetails.ProfileImagePath,
Email: memberdetails.Email,
IsActive: &memberdetails.IsActive,
Mobile: &memberdetails.MobileNo,
GroupID: &memberdetails.MemberGroupId,
NameString: &memberdetails.NameString,
}
return &memdet, nil
}
//Update Memberprofile//
func UpdateMemberProfile(ctx context.Context, input *model.UpdateMember) (*model.UpdatememberResponse, error) {
c, ok := ctx.Value(GinContext).(*gin.Context)
if !ok {
ErrorLog.Printf("%v", info.ErrGinCtx)
c.AbortWithError(500, nil)
}
if input.ID == 0 {
return &model.UpdatememberResponse{Message: "Invalid member ID"}, fmt.Errorf("member ID cannot be zero")
}
var imageName, imagePath, lastname, Password, hasspass string
tenantData, _ := c.Get("tenantDetails")
tenantDetails := tenantData.(team.TblUser)
member, err := MemberInstance.GetMemberDetails(input.ID, tenantDetails.TenantId)
if err != nil {
return &model.UpdatememberResponse{Message: "Member not found or deleted"}, fmt.Errorf("member with ID %d not found: %v", input.ID, err)
}
if input.RemoveImage.IsSet() && *input.RemoveImage.Value() {
imageName = ""
imagePath = ""
} else if input.ProfileImage.IsSet() && *input.ProfileImage.Value() != "" {
var err error
var imageByte []byte
imageName, imagePath, imageByte, err = controllers.ConvertBase64toByte(*input.ProfileImage.Value(), "member")
if err != nil {
return &model.UpdatememberResponse{Message: "Failed to image upload"}, err
}
imagePath = tenantDetails.S3FolderName + imagePath
if uerr := storagecontroller.UploadCropImageS3(imageName, imagePath, imageByte); uerr != nil {
return &model.UpdatememberResponse{Message: "Failed to image upload"}, uerr
}
} else {
imageName = member.ProfileImage
imagePath = member.ProfileImagePath
}
fmt.Println("imagename", imageName, imagePath)
if input.LastName.IsSet() && input.LastName.Value() != nil {
lastname = *input.LastName.Value()
}
if input.Password.IsSet() && input.Password.Value() != nil {
Password = *input.Password.Value()
}
// if input.Username.IsSet() && input.Username.Value() != nil {
// Username = *input.Username.Value()
// }
if input.Email != "" {
isExist, err := MemberInstance.CheckEmailInMember(input.ID, input.Email, tenantDetails.TenantId)
if isExist || err == nil {
fmt.Println("isexit", isExist, err)
err = errors.New("Email already exists")
c.AbortWithError(http.StatusBadRequest, err)
return &model.UpdatememberResponse{Message: "Email Already Exists"}, err
}
}
if input.Mobile != "" {
isExist, err := MemberInstance.CheckNumberInMember(input.ID, input.Mobile, tenantDetails.TenantId)
if isExist || err == nil {
err = errors.New("Mobile Number already exists")
c.AbortWithError(http.StatusBadRequest, err)
return &model.UpdatememberResponse{Message: "Mobile Number Already Exists"}, err
}
}
if Password != "" {
hasspass = hashingPassword(Password)
} else {
hasspass = member.Password
}
updateMap := map[string]interface{}{
"first_name": input.FirstName,
"last_name": lastname,
"mobile_no": input.Mobile,
"email": input.Email,
"password": hasspass,
"profile_image": imageName,
"profile_image_path": imagePath,
"is_active": 1,
"storage_type": "aws",
}
err2 := MemberInstance.MemberFlexibleUpdate(updateMap, input.ID, tenantDetails.Id, tenantDetails.TenantId)
if err2 != nil {
return &model.UpdatememberResponse{Message: "User Update error"}, err2
}
nmember, _ := MemberInstance.GetMemberDetails(input.ID, tenantDetails.TenantId)
return &model.UpdatememberResponse{
Message: "User Updated Successfully",
MemberDetails: &model.Members{
FirstName: nmember.FirstName,
LastName: &nmember.LastName,
Email: nmember.Email,
Mobile: &nmember.MobileNo,
ProfileImage: &nmember.ProfileImage,
ProfileImagePath: &nmember.ProfileImagePath,
Username: &nmember.Username,
ID: &nmember.Id,
},
}, nil
}
func hashingPassword(pass string) string {
passbyte, err := bcrypt.GenerateFromPassword([]byte(pass), 14)
if err != nil {
panic(err)
}
return string(passbyte)
}
-91
View File
@@ -1,91 +0,0 @@
# Where are all the schema files located? globs are supported eg src/**/*.graphqls
schema:
- schema/*.graphqls
# Where should the generated server code go?
exec:
filename: graph/generated.go
package: graph
# Uncomment to enable federation
# federation:
# filename: graph/federation.go
# package: graph
# Where should any generated models go?
model:
filename: model/models_gen.go
package: model
# Where should the resolver implementations go?
resolver:
layout: follow-schema
dir: resolvers
package: resolvers
filename_template: "{name}.resolvers.go"
# Optional: turn on to not generate template comments above resolvers
# omit_template_comment: false
# Optional: turn on use ` + "`" + `gqlgen:"fieldName"` + "`" + ` tags in your models
# struct_tag: json
# Optional: turn on to use []Thing instead of []*Thing
omit_slice_element_pointers: true
# Optional: turn on to omit Is<Name>() methods to interface and unions
# omit_interface_checks : true
# Optional: turn on to skip generation of ComplexityRoot struct content and Complexity function
# omit_complexity: false
# Optional: turn on to not generate any file notice comments in generated files
# omit_gqlgen_file_notice: false
# Optional: turn on to exclude the gqlgen version in the generated file notice. No effect if `omit_gqlgen_file_notice` is true.
# omit_gqlgen_version_in_file_notice: false
# Optional: turn off to make struct-type struct fields not use pointers
# e.g. type Thing struct { FieldA OtherThing } instead of { FieldA *OtherThing }
# struct_fields_always_pointers: true
# Optional: turn off to make resolvers return values instead of pointers for structs
# resolvers_always_return_pointers: true
# Optional: turn on to return pointers instead of values in unmarshalInput
# return_pointers_in_unmarshalinput: false
# Optional: wrap nullable input fields with Omittable
nullable_input_omittable: true
# Optional: set to speed up generation time by not performing a final validation pass.
# skip_validation: true
# Optional: set to skip running `go mod tidy` when generating server code
# skip_mod_tidy: true
# gqlgen will search for any type names in the schema in these go packages
# if they match it will use them, otherwise it will generate them.
autobind:
# - "spurtcms-graphql/graph/model"
# This section declares type mapping between the GraphQL and go type systems
#
# The first line in each type will be used as defaults for resolver arguments and
# modelgen, the others will be allowed when binding to fields. Configure them to
# your liking
models:
ID:
model:
- github.com/99designs/gqlgen/graphql.ID
- github.com/99designs/gqlgen/graphql.Int
- github.com/99designs/gqlgen/graphql.Int64
- github.com/99designs/gqlgen/graphql.Int32
Int:
model:
- github.com/99designs/gqlgen/graphql.Int
- github.com/99designs/gqlgen/graphql.Int64
- github.com/99designs/gqlgen/graphql.Int32
CustomString:
model:
- spurt-cms/graphql/scalars.CustomString
File diff suppressed because it is too large Load Diff
-23
View File
@@ -1,23 +0,0 @@
package info
import "errors"
var (
ErrLoadEnv = errors.New("failed to load env file")
ErrGinCtx = errors.New("failed to get gin context")
ErrAuth = errors.New("unauthorized access")
ErrReqApiKey = errors.New("required api token to access graphql server")
ErrExpireApiKey = errors.New("graphql api token expired")
ErrTenantId = errors.New("tenant id is required")
ErrMemberRegisterPerm = errors.New("member register permission denied")
ErrFetchTenantDetails = errors.New("failed to get tenant Details")
ErrGetImage = errors.New("failed to retrieve the file")
ErrGetAwsCreds = errors.New("failed to retrieve the aws credentials")
ErrDecodeImg = errors.New("failed to parse the image data")
ErrImageResize = errors.New("failed to resize the image")
ErrFetchCategoryDetails = errors.New("failed to get the category list")
ErrReqMandatory = errors.New("required mandatory fields")
ErrNoRowsAffected = errors.New("no rows affected")
ErrUpdateViewCount = errors.New("failed to update view count")
ErrRecordNotFound = errors.New("record not found")
)
-76
View File
@@ -1,76 +0,0 @@
package loggger
import (
"fmt"
"log"
"os"
)
var (
LogFilePath = "graphql/logs/errors.log"
logger *Logger
)
const (
InfoLevel = iota
WarningLevel
ErrorLevel
)
type Logger struct {
Level int
InfoLogger *log.Logger
WarnLogger *log.Logger
ErrorLogger *log.Logger
}
func init() {
_, err := os.Stat(LogFilePath)
var LogFile *os.File
if os.IsNotExist(err) {
makErr := os.MkdirAll("graphql/log/", 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 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
}
-179
View File
@@ -1,179 +0,0 @@
package middleware
import (
"context"
"errors"
"fmt"
"net/http"
"os"
"spurt-cms/graphql/controller"
"spurt-cms/graphql/info"
"spurt-cms/graphql/model"
"time"
"github.com/99designs/gqlgen/graphql"
"github.com/gin-gonic/gin"
"github.com/golang-jwt/jwt"
"github.com/spurtcms/team"
"gorm.io/gorm"
)
func AuthMiddleware(ctx context.Context, _ interface{}, next graphql.Resolver) (interface{}, error) {
c, ok := ctx.Value(controller.GinContext).(*gin.Context)
if !ok {
controller.ErrorLog.Printf("%v", info.ErrGinCtx)
c.AbortWithStatus(http.StatusInternalServerError)
return nil, info.ErrGinCtx
}
var graphqlSettings model.TblGraphqlSettings
err := AuthenticateApiKey(c, &graphqlSettings)
if err != nil {
controller.ErrorLog.Printf("%v", err)
c.AbortWithStatus(http.StatusBadRequest)
return nil, err
}
tenantDetails, err := controller.NewTeamWP.UserDetails(team.Team{TenantId: graphqlSettings.TenantId})
if err != nil {
if err == gorm.ErrRecordNotFound {
controller.ErrorLog.Printf("%v", info.ErrTenantId)
c.AbortWithStatus(http.StatusBadRequest)
return nil, err
}
controller.ErrorLog.Printf("%v", err)
c.AbortWithStatus(http.StatusInternalServerError)
return nil, err
}
userkey := c.GetHeader("Userkey")
var userdet *model.Members
if userkey != "" {
fmt.Println("checkmemberlogin")
userdet, err = AuthenticateUserLogin(c, userkey)
if err != nil {
controller.ErrorLog.Printf("%v", err)
c.AbortWithStatus(http.StatusBadRequest)
return nil, err
}
}
fmt.Println(userdet, "userdetails")
c.Set("userdetails", userdet)
c.Set("tenantDetails", tenantDetails)
return next(ctx)
}
func AuthenticateApiKey(c *gin.Context, graphqlSettings *model.TblGraphqlSettings) error {
apiKey := c.GetHeader("ApiKey")
err := model.Model.GetApiSettings(apiKey, graphqlSettings)
if err != nil {
switch {
case err == gorm.ErrRecordNotFound && apiKey != "":
return errors.New("invalid api key")
case err == gorm.ErrRecordNotFound && apiKey == "":
return errors.New("api key required")
default:
return err
}
}
if graphqlSettings.Duration != "Unlimited" && time.Now().After(graphqlSettings.ExpiryTime) {
return info.ErrExpireApiKey
}
return nil
}
func AuthenticateUserLogin(c *gin.Context, userkey string) (userdetails *model.Members, err error) {
Claims := jwt.MapClaims{}
tkn, err := jwt.ParseWithClaims(userkey, Claims, func(token *jwt.Token) (interface{}, error) {
return []byte(os.Getenv("JWT_SECRET")), nil
})
var ErrorToken = errors.New("invalid token")
if err != nil {
if err == jwt.ErrSignatureInvalid {
fmt.Println(err, "kkkkk")
return &model.Members{}, ErrorToken
}
return &model.Members{}, ErrorToken
}
if !tkn.Valid {
fmt.Println(tkn)
return &model.Members{}, ErrorToken
}
usrid := Claims["member_id"]
tenantid := Claims["tenant_id"]
fmt.Println(usrid, tenantid, "detailsauth")
useridint := int(usrid.(float64))
tenantint := string(tenantid.(string))
// user, _ := strconv.Atoi(useridint)
c.Set("memberid", useridint)
member, _ := controller.MemberInstance.GetMemberDetails(useridint, tenantint)
return &model.Members{FirstName: member.FirstName, LastName: &member.LastName, Email: member.Email, Mobile: &member.MobileNo, ProfileImage: &member.ProfileImage, ProfileImagePath: &member.ProfileImagePath, Username: &member.Username, ID: &member.Id}, nil
}
func LimitRequestBodySize(limit int64) gin.HandlerFunc {
return func(c *gin.Context) {
c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, limit)
c.Next()
}
}
-26
View File
@@ -1,26 +0,0 @@
package middleware
import "github.com/gin-gonic/gin"
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, Authorization, ApiKey, TenantId, accept, origin, Cache-Control, X-Requested-With,Userkey")
c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT")
if c.Request.Method == "OPTIONS" {
c.AbortWithStatus(204)
return
}
c.Next()
}
}
-107
View File
@@ -1,107 +0,0 @@
package model
import (
"spurt-cms/models"
"time"
"gorm.io/datatypes"
"gorm.io/gorm"
)
var (
Model ModelConfig
)
type ModelConfig struct {
DB *gorm.DB
}
type TblGraphqlSettings struct {
Id int `gorm:"primaryKey;auto_increment;"`
TokenName string
Description string
Duration string
CreatedBy int
CreatedOn time.Time
ModifiedBy int
ModifiedOn time.Time
DeletedBy int
DeletedOn time.Time
IsDeleted int `gorm:"DEFAULT:0"`
Token string
ExpiryTime time.Time
IsDefault int `gorm:"Default:NULl"`
TenantId string
}
type TblMstrTenant struct {
Id int `gorm:"primaryKey;auto_increment"`
TenantId string
IsDeleted int `gorm:"DEFAULT:0"`
DeletedBy int `gorm:"DEFAULT:NULL"`
DeletedOn time.Time
}
type TblStorageTypes struct {
Id int `gorm:"primaryKey;auto_increment"`
Local string
Aws datatypes.JSONMap
Azure datatypes.JSONMap
Drive datatypes.JSONMap
SelectedType string
TenantId string
}
func init() {
Model = ModelConfig{DB: models.DB}
}
func (model ModelConfig) GetApiSettings(apikey string, graphqlsettings *TblGraphqlSettings) error {
if err := model.DB.Debug().Model(TblGraphqlSettings{}).Where("is_deleted = 0 and token = ?", apikey).First(&graphqlsettings).Error; err != nil {
return err
}
return nil
}
func (model ModelConfig) GetTenantDetails(tenantId string, tenantDetails *TblMstrTenant) error {
if err := model.DB.Debug().Model(TblMstrTenant{}).Where("is_deleted=0 and id=?", tenantId).First(&tenantDetails).Error; err != nil {
return err
}
return nil
}
func GetStorageType(db *gorm.DB, storageType *TblStorageTypes) error {
if err := db.Debug().Model(TblStorageTypes{}).First(&storageType).Error; err != nil {
return err
}
return nil
}
func (model ModelConfig) GettenantByapikey(apikey string) (tenant TblGraphqlSettings, err error) {
if err := model.DB.Debug().Model(TblGraphqlSettings{}).Where("is_deleted = 0 and token = ?", apikey).First(&tenant).Error; err != nil {
return TblGraphqlSettings{}, err
}
return tenant, nil
}
func (model ModelConfig) GetUserbyTenantId(tenantid string) (user models.TblUser, err error) {
if err := model.DB.Debug().Table("tbl_users").Where("is_deleted = 0 and tenant_id = ?", tenantid).First(&user).Error; err != nil {
return models.TblUser{}, err
}
return user, nil
}
-136
View File
@@ -1,136 +0,0 @@
package model
import (
"fmt"
"os"
"time"
"github.com/golang-jwt/jwt"
"golang.org/x/crypto/bcrypt"
)
type MembersListReq struct {
Limit int
Offset int
Keyword string
TenantId string
Count bool
}
type TblMemberGroup struct {
Id int
Name string
Slug string
Description string
IsActive int
IsDeleted 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"`
TenantId string
}
func (model ModelConfig) MembersList(inputs MembersListReq) (members []Members, count int64, err error) {
fmt.Println(model.DB, inputs.Count, inputs.Limit, "dbvalue")
query := model.DB.Debug().Table("tbl_members").Where("tbl_members.is_deleted = 0").Order("id desc")
if inputs.TenantId != "" {
query = query.Where("tbl_members.tenant_id=?", inputs.TenantId)
}
if inputs.Keyword != "" {
query = query.Where("LOWER(TRIM(first_name)) LIKE LOWER(TRIM(?))", "%"+inputs.Keyword+"%")
}
if inputs.Count {
err = query.Count(&count).Error
if err != nil {
return []Members{}, 0, err
}
}
if inputs.Limit != 0 {
query = query.Limit(inputs.Limit)
}
if inputs.Offset != -1 {
query = query.Offset(inputs.Offset)
}
err = query.Find(&members).Error
if err != nil {
return []Members{}, 0, err
}
fmt.Println(members, "mmembersss")
return members, count, nil
}
func (model ModelConfig) CheckMemberLogin(Email string, Password string, userid int, tenantid string) (string, bool, bool, error) {
var members Members
err := model.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 := model.CreateToken(members)
if err != nil {
return "", false, true, err
}
return token, true, true, nil
}
func (model ModelConfig) CreateToken(members Members) (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")))
}
func (model ModelConfig) GetmemberGroup(slug string, tenantid string) (membergrb TblMemberGroup,err error) {
err1 := model.DB.Table("tbl_member_groups").Where("tbl_member_groups.is_deleted = 0 and slug=? and tbl_member_groups.tenant_id = ?",slug, tenantid).First(&membergrb).Error
if err1 != nil {
return TblMemberGroup{},nil
}
return TblMemberGroup{}, nil
}
-450
View File
@@ -1,450 +0,0 @@
// Code generated by github.com/99designs/gqlgen, DO NOT EDIT.
package model
import (
"spurt-cms/graphql/scalars"
"time"
"github.com/99designs/gqlgen/graphql"
)
type AdditionalFields struct {
Sections []Section `json:"sections,omitempty"`
Fields []Field `json:"fields,omitempty"`
}
type Author struct {
ID int `json:"id"`
FirstName string `json:"firstName"`
LastName string `json:"lastName"`
Email string `json:"email"`
MobileNo *string `json:"mobileNo,omitempty"`
IsActive *int `json:"isActive,omitempty"`
ProfileImagePath *string `json:"profileImagePath,omitempty"`
CreatedOn time.Time `json:"createdOn"`
CreatedBy int `json:"createdBy"`
ModifiedOn *time.Time `json:"modifiedOn,omitempty"`
ModifiedBy *int `json:"modifiedBy,omitempty"`
TenantID string `json:"tenantId"`
RoleID *int `json:"roleId,omitempty"`
RoleName *string `json:"roleName,omitempty"`
NameString *string `json:"NameString,omitempty"`
}
type Category struct {
ID int `json:"id"`
CategoryName string `json:"categoryName"`
CategorySlug string `json:"categorySlug"`
Description string `json:"description"`
ImagePath string `json:"imagePath"`
CreatedOn time.Time `json:"createdOn"`
CreatedBy int `json:"createdBy"`
ModifiedOn *time.Time `json:"modifiedOn,omitempty"`
ModifiedBy *int `json:"modifiedBy,omitempty"`
ParentID int `json:"parentId"`
TenantID string `json:"tenantId"`
}
type CategoryDetails struct {
Categorylist []Category `json:"categorylist"`
Count int `json:"count"`
}
type CategoryFilter struct {
CategoryGroupID graphql.Omittable[*int] `json:"categoryGroupId,omitempty"`
HierarchyLevel graphql.Omittable[*int] `json:"hierarchyLevel,omitempty"`
ExcludeGroup graphql.Omittable[*bool] `json:"excludeGroup,omitempty"`
ExcludeParent graphql.Omittable[*bool] `json:"excludeParent,omitempty"`
ExactLevelOnly graphql.Omittable[*bool] `json:"exactLevelOnly,omitempty"`
CheckEntriesPresence graphql.Omittable[*bool] `json:"checkEntriesPresence,omitempty"`
CategoryGroupSlug graphql.Omittable[*string] `json:"categoryGroupSlug,omitempty"`
ChannelSlug graphql.Omittable[*string] `json:"channelSlug,omitempty"`
}
type Channel struct {
ID int `json:"id"`
ChannelName string `json:"channelName"`
ChannelDescription string `json:"channelDescription"`
SlugName string `json:"slugName"`
FieldGroupID int `json:"fieldGroupId"`
IsActive int `json:"isActive"`
CreatedOn time.Time `json:"createdOn"`
CreatedBy int `json:"createdBy"`
IsDeleted int `json:"isDeleted"`
ModifiedOn *time.Time `json:"modifiedOn,omitempty"`
ModifiedBy *int `json:"modifiedBy,omitempty"`
TenantID string `json:"tenantId"`
}
type ChannelDetails struct {
Channellist []Channel `json:"channellist"`
Count int `json:"count"`
}
type ChannelEntries struct {
ID int `json:"id"`
Title string `json:"title"`
Slug string `json:"slug"`
Description scalars.CustomString `json:"description"`
UserID int `json:"userId"`
ChannelID int `json:"channelId"`
Status int `json:"status"`
IsActive int `json:"isActive"`
CreatedOn time.Time `json:"createdOn"`
CreatedBy int `json:"createdBy"`
ModifiedBy *int `json:"modifiedBy,omitempty"`
ModifiedOn *time.Time `json:"modifiedOn,omitempty"`
CoverImage string `json:"coverImage"`
ThumbnailImage string `json:"thumbnailImage"`
MetaTitle string `json:"metaTitle"`
MetaDescription string `json:"metaDescription"`
Keyword string `json:"keyword"`
CategoriesID string `json:"categoriesId"`
RelatedArticles string `json:"relatedArticles"`
FeaturedEntry int `json:"featuredEntry"`
ViewCount int `json:"viewCount"`
Author *string `json:"author,omitempty"`
SortOrder *int `json:"sortOrder,omitempty"`
CreateTime *time.Time `json:"createTime,omitempty"`
PublishedTime *time.Time `json:"publishedTime,omitempty"`
ReadingTime *int `json:"readingTime,omitempty"`
Tags *string `json:"tags,omitempty"`
Excerpt *string `json:"excerpt,omitempty"`
ImageAltTag *string `json:"imageAltTag,omitempty"`
Categories [][]Category `json:"categories,omitempty"`
AdditionalFields *AdditionalFields `json:"additionalFields,omitempty"`
AuthorDetails *Author `json:"authorDetails,omitempty"`
MemberProfile *MemberProfile `json:"memberProfile,omitempty"`
TenantID string `json:"tenantId"`
ContentChunk *Chunk `json:"contentChunk,omitempty"`
CtaLink *string `json:"ctaLink,omitempty"`
SavedFlag *bool `json:"savedFlag,omitempty"`
PreviewLink *string `json:"PreviewLink,omitempty"`
UUID *string `json:"Uuid,omitempty"`
}
type ChannelEntryDetails struct {
ChannelEntriesList []ChannelEntries `json:"channelEntriesList"`
Count int `json:"count"`
}
type Chunk struct {
Data []string `json:"data"`
Length int `json:"length"`
}
type CountUpdate struct {
Count int `json:"count"`
Status bool `json:"status"`
}
type Course struct {
ID int `json:"id"`
Title string `json:"title"`
Description string `json:"description"`
ImageName string `json:"imageName"`
ImagePath string `json:"imagePath"`
Category int `json:"category"`
TenantID string `json:"tenantId"`
}
type CourseDetails struct {
Lesson []Lesson `json:"lesson"`
Section []Sections `json:"section"`
}
type CourseLists struct {
Courselist []Course `json:"courselist"`
Count int `json:"count"`
}
type EntriesAdditionalData struct {
AuthorDetails graphql.Omittable[*bool] `json:"authorDetails,omitempty"`
MemberProfile graphql.Omittable[*bool] `json:"memberProfile,omitempty"`
AdditionalFields graphql.Omittable[*bool] `json:"additionalFields,omitempty"`
Categories graphql.Omittable[*bool] `json:"categories,omitempty"`
SavedList graphql.Omittable[*bool] `json:"savedList,omitempty"`
MemberID graphql.Omittable[*int] `json:"MemberId,omitempty"`
}
type EntriesFilter struct {
ChannelID graphql.Omittable[*int] `json:"channelId,omitempty"`
CategoryID graphql.Omittable[*int] `json:"categoryId,omitempty"`
CategorySlug graphql.Omittable[*string] `json:"categorySlug,omitempty"`
GetChildCategories graphql.Omittable[*bool] `json:"getChildCategories,omitempty"`
Status graphql.Omittable[*string] `json:"Status,omitempty"`
ChannelName graphql.Omittable[*string] `json:"ChannelName,omitempty"`
}
type EntrySave struct {
EntryID int `json:"entryId"`
UserID int `json:"userId"`
TenantID string `json:"tenantId"`
Save bool `json:"save"`
}
type Field struct {
ID int `json:"id"`
FieldName string `json:"fieldName"`
FieldTypeID int `json:"fieldTypeId"`
MandatoryField int `json:"mandatoryField"`
OptionExist int `json:"optionExist"`
CreatedOn time.Time `json:"createdOn"`
CreatedBy int `json:"createdBy"`
ModifiedOn *time.Time `json:"modifiedOn,omitempty"`
ModifiedBy *int `json:"modifiedBY,omitempty"`
FieldDesc string `json:"fieldDesc"`
OrderIndex int `json:"orderIndex"`
ImagePath string `json:"imagePath"`
DatetimeFormat *string `json:"datetimeFormat,omitempty"`
TimeFormat *string `json:"timeFormat,omitempty"`
SectionParentID *int `json:"sectionParentId,omitempty"`
CharacterAllowed *int `json:"characterAllowed,omitempty"`
FieldTypeName string `json:"fieldTypeName"`
FieldValue *FieldValue `json:"fieldValue,omitempty"`
FieldOptions []FieldOptions `json:"fieldOptions,omitempty"`
TenantID string `json:"tenantId"`
}
type FieldOptions struct {
ID int `json:"id"`
OptionName string `json:"optionName"`
OptionValue string `json:"optionValue"`
CreatedOn time.Time `json:"createdOn"`
CreatedBy int `json:"createdBy"`
ModifiedOn *time.Time `json:"modifiedOn,omitempty"`
ModifiedBy *int `json:"modifiedBY,omitempty"`
TenantID string `json:"tenantId"`
}
type FieldValue struct {
ID int `json:"id"`
FieldValue string `json:"fieldValue"`
CreatedOn time.Time `json:"createdOn"`
CreatedBy int `json:"createdBy"`
ModifiedOn *time.Time `json:"modifiedOn,omitempty"`
ModifiedBy *int `json:"modifiedBY,omitempty"`
TenantID string `json:"tenantId"`
}
type Filter struct {
Limit graphql.Omittable[*int] `json:"limit,omitempty"`
Offset graphql.Omittable[*int] `json:"offset,omitempty"`
IsActive graphql.Omittable[*bool] `json:"isActive,omitempty"`
Keyword graphql.Omittable[*string] `json:"keyword,omitempty"`
Location graphql.Omittable[*string] `json:"location,omitempty"`
Experience graphql.Omittable[*string] `json:"Experience,omitempty"`
Posteddate graphql.Omittable[*string] `json:"posteddate,omitempty"`
}
type ForgotPasswordResponse struct {
Message string `json:"message"`
Success bool `json:"success"`
}
type GeneralInfo struct {
CompanyName string `json:"companyName"`
LogoPath string `json:"logoPath"`
ExpandLogoPath string `json:"expandLogoPath"`
TenantID string `json:"tenantId"`
}
type Lesson struct {
ID int `json:"id"`
CourseID int `json:"courseId"`
SectionID int `json:"sectionId"`
Title string `json:"title"`
Content string `json:"content"`
EmbedLink string `json:"embedLink"`
FileName string `json:"fileName"`
FilePath string `json:"filePath"`
LessonType string `json:"lessonType"`
OrderIndex int `json:"orderIndex"`
TenantID string `json:"tenantId"`
}
type MemberArguments struct {
Module graphql.Omittable[*int] `json:"module,omitempty"`
TenantID graphql.Omittable[*string] `json:"tenantId,omitempty"`
}
type MemberCheckLoginResponse struct {
Email bool `json:"email"`
Password bool `json:"password"`
Message string `json:"message"`
Token string `json:"token"`
Success bool `json:"success"`
MemberDetails *Members `json:"memberDetails,omitempty"`
}
type MemberDetails struct {
ID graphql.Omittable[*int] `json:"id,omitempty"`
FirstName string `json:"firstName"`
LastName graphql.Omittable[*string] `json:"lastName,omitempty"`
Mobile graphql.Omittable[*string] `json:"mobile,omitempty"`
Email string `json:"email"`
Password string `json:"password"`
IsActive graphql.Omittable[*int] `json:"isActive,omitempty"`
ProfileImage graphql.Omittable[*string] `json:"profileImage,omitempty"`
ProfileImagePath graphql.Omittable[*string] `json:"profileImagePath,omitempty"`
Username graphql.Omittable[*string] `json:"username,omitempty"`
GroupID graphql.Omittable[*int] `json:"groupId,omitempty"`
UserID int `json:"userId"`
TenantID string `json:"tenantId"`
Message graphql.Omittable[*string] `json:"message,omitempty"`
}
type MemberInfo struct {
Email string `json:"email"`
TenantID string `json:"tenantId"`
URL string `json:"url"`
}
type MemberProfile struct {
ID int `json:"id"`
MemberID int `json:"memberId"`
ProfileName string `json:"profileName"`
ProfileSlug string `json:"profileSlug"`
ProfilePage *string `json:"profilePage,omitempty"`
MemberDetails any `json:"memberDetails,omitempty"`
CompanyName *string `json:"companyName,omitempty"`
CompanyLocation *string `json:"companyLocation,omitempty"`
CompanyLogo *string `json:"companyLogo,omitempty"`
About *string `json:"about,omitempty"`
SeoTitle *string `json:"seoTitle,omitempty"`
SeoDescription *string `json:"seoDescription,omitempty"`
SeoKeyword *string `json:"seoKeyword,omitempty"`
Linkedin *string `json:"linkedin,omitempty"`
Twitter *string `json:"twitter,omitempty"`
Website *string `json:"website,omitempty"`
CreatedBy *int `json:"createdBy,omitempty"`
CreatedOn *time.Time `json:"createdOn,omitempty"`
ModifiedOn *time.Time `json:"modifiedOn,omitempty"`
ModifiedBy *int `json:"modifiedBy,omitempty"`
ClaimStatus *int `json:"claimStatus,omitempty"`
IsActive *int `json:"IsActive,omitempty"`
TenantID string `json:"tenantId"`
ClaimDate *time.Time `json:"claimDate,omitempty"`
}
type MemberResetpassInfo struct {
NewPassword string `json:"newPassword"`
ConfrimPassword string `json:"confrimPassword"`
Token string `json:"token"`
}
type MemberSettings struct {
ID int `json:"id"`
AllowRegistration int `json:"allowRegistration"`
MemberLogin string `json:"memberLogin"`
ModifiedBy *int `json:"modifiedBy,omitempty"`
ModifiedOn *time.Time `json:"modifiedOn,omitempty"`
NotificationUsers string `json:"notificationUsers"`
TenantID string `json:"tenantId"`
}
type MemberSignin struct {
Email string `json:"email"`
Password string `json:"password"`
UserID int `json:"userId"`
TenantID string `json:"tenantId"`
}
type Members struct {
ID *int `json:"Id,omitempty"`
FirstName string `json:"firstName"`
LastName *string `json:"lastName,omitempty"`
Mobile *string `json:"mobile,omitempty"`
Email string `json:"email"`
Password string `json:"password"`
IsActive *int `json:"isActive,omitempty"`
ProfileImage *string `json:"profileImage,omitempty"`
ProfileImagePath *string `json:"profileImagePath,omitempty"`
Username *string `json:"username,omitempty"`
GroupID *int `json:"groupId,omitempty"`
CreatedBy *int `json:"createdBy,omitempty"`
CreatedOn *time.Time `json:"createdOn,omitempty"`
ModifiedOn *time.Time `json:"modifiedOn,omitempty"`
ModifiedBy *int `json:"modifiedBy,omitempty"`
TenantID string `json:"tenantId"`
IsDeleted int `json:"isDeleted"`
StorageType *string `json:"storageType,omitempty"`
NameString *string `json:"NameString,omitempty"`
}
type MembersDetails struct {
MembersList []Members `json:"membersList"`
Count int `json:"count"`
}
type Mutation struct {
}
type Query struct {
}
type Section struct {
ID int `json:"id"`
SectionName string `json:"sectionName"`
SectionTypeID int `json:"sectionTypeId"`
CreatedOn time.Time `json:"createdOn"`
CreatedBy int `json:"createdBy"`
ModifiedOn *time.Time `json:"modifiedOn,omitempty"`
ModifiedBy *int `json:"modifiedBY,omitempty"`
OrderIndex int `json:"orderIndex"`
TenantID string `json:"tenantId"`
}
type Sections struct {
ID int `json:"id"`
CourseID int `json:"courseId"`
Title string `json:"title"`
Content string `json:"content"`
OrderIndex int `json:"orderIndex"`
TenantID string `json:"tenantId"`
}
type SocialLoginInput struct {
FirstName string `json:"firstName"`
LastName graphql.Omittable[*string] `json:"lastName,omitempty"`
Email string `json:"email"`
Password graphql.Omittable[*string] `json:"password,omitempty"`
Username graphql.Omittable[*string] `json:"username,omitempty"`
}
type SocialLoginResponse struct {
Message string `json:"message"`
Token string `json:"token"`
Userid int `json:"userid"`
}
type Sort struct {
SortBy graphql.Omittable[*string] `json:"sortBy,omitempty"`
Order graphql.Omittable[*int] `json:"order,omitempty"`
}
type UpdateMember struct {
ID int `json:"Id"`
FirstName string `json:"firstName"`
LastName graphql.Omittable[*string] `json:"lastName,omitempty"`
Mobile string `json:"mobile"`
Email string `json:"email"`
Password graphql.Omittable[*string] `json:"password,omitempty"`
IsActive graphql.Omittable[*int] `json:"isActive,omitempty"`
ProfileImage graphql.Omittable[*string] `json:"profileImage,omitempty"`
ProfileImagePath graphql.Omittable[*string] `json:"profileImagePath,omitempty"`
Username graphql.Omittable[*string] `json:"username,omitempty"`
GroupID graphql.Omittable[*int] `json:"groupId,omitempty"`
CreatedBy graphql.Omittable[*int] `json:"createdBy,omitempty"`
CreatedOn graphql.Omittable[*time.Time] `json:"createdOn,omitempty"`
ModifiedOn graphql.Omittable[*time.Time] `json:"modifiedOn,omitempty"`
ModifiedBy graphql.Omittable[*int] `json:"modifiedBy,omitempty"`
TenantID graphql.Omittable[*string] `json:"tenantId,omitempty"`
RemoveImage graphql.Omittable[*bool] `json:"removeImage,omitempty"`
}
type UpdatememberResponse struct {
MemberDetails *Members `json:"memberDetails"`
Message string `json:"message"`
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

-1
View File
@@ -1 +0,0 @@
function scrollSpy(){var l=5,e=document.querySelector("html"),c=(e&&(e=window.getComputedStyle(e).scrollPaddingTop)&&"string"==typeof e&&"auto"!==e&&e.endsWith("px")&&(l+=parseInt(e.split("px")[0])),"nav-scroll-active"),i=null,d=[];function t(){i=null;var e=document.querySelectorAll("[data-traverse-target]");Array.prototype.forEach.call(e,function(e){d.push({id:e.id,top:e.offsetTop})})}var n=debounce(function(){t(),o()},500),o=debounce(function(){var e,t,n,o,r=(e=>{for(var t=e+l,n=0;n<d.length;n++){var o=d[n+1];if(t>=d[n].top&&(!o||t<o.top))return n}return-1})(document.documentElement.scrollTop||document.body.scrollTop);r!==i&&(r=d[i=r],e=document.querySelector("."+c),t=s(r=r?document.querySelector('#nav a[href="#'+r.id+'"]'):null),n=(o=s(e))!==t,o&&n&&u(o,!1),t&&n&&u(t,!0),r&&(r.classList.add(c),r.scrollIntoViewIfNeeded?r.scrollIntoViewIfNeeded():!r.scrollIntoView||0<=(o=(o=r).getBoundingClientRect()).top&&0<=o.left&&o.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&o.right<=(window.innerWidth||document.documentElement.clientWidth)||r.scrollIntoView({block:"center",inline:"start"})),e)&&e.classList.remove(c)},100);function u(e,t){for(var n=t?"add":"remove";e;)e.classList[n]("nav-scroll-expand"),e=s(e.parentNode)}function s(e){return e&&e.closest?e.closest(".nav-group-section"):null}setTimeout(function(){t(),o(),window.addEventListener("scroll",o),window.addEventListener("resize",n)},300)}function toggleMenu(){var t="drawer-open",e=document.querySelector("#spectaql .sidebar-open-button"),n=document.querySelector("#spectaql #sidebar .close-button"),o=document.querySelector("#spectaql .drawer-overlay");function r(){var e=document.querySelector("#spectaql #page");e.classList.contains(t)?e.classList.remove(t):e.classList.add(t)}e.addEventListener("click",r),n.addEventListener("click",r),o.addEventListener("click",r)}function debounce(e,t){var n=null;return function(){clearTimeout(n),n=setTimeout(function(){e.apply(null)},t)}}window.addEventListener("DOMContentLoaded",e=>{toggleMenu(),scrollSpy()});
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
-27
View File
@@ -1,27 +0,0 @@
package resolvers
// This file will be automatically regenerated based on the schema, any resolver implementations
// will be copied through when generating and any unknown code will be moved to the end.
// Code generated by github.com/99designs/gqlgen version v0.17.66
import (
"context"
"spurt-cms/graphql/controller"
"spurt-cms/graphql/graph"
"spurt-cms/graphql/model"
)
// CategoryList is the resolver for the CategoryList field.
func (r *queryResolver) CategoryList(ctx context.Context, categoryFilter *model.CategoryFilter, commonFilter *model.Filter) (*model.CategoryDetails, error) {
return controller.CategoryList(ctx, categoryFilter, commonFilter)
}
// GeneralInformation is the resolver for the GeneralInformation field.
func (r *queryResolver) GeneralInformation(ctx context.Context, tenantID *string) (*model.GeneralInfo, error) {
return controller.GeneralInfo(ctx, tenantID)
}
// Query returns graph.QueryResolver implementation.
func (r *Resolver) Query() graph.QueryResolver { return &queryResolver{r} }
type queryResolver struct{ *Resolver }
-52
View File
@@ -1,52 +0,0 @@
package resolvers
// This file will be automatically regenerated based on the schema, any resolver implementations
// will be copied through when generating and any unknown code will be moved to the end.
// Code generated by github.com/99designs/gqlgen version v0.17.66
import (
"context"
"spurt-cms/graphql/controller"
"spurt-cms/graphql/graph"
"spurt-cms/graphql/model"
)
// UpdateEntryViewCount is the resolver for the UpdateEntryViewCount field.
func (r *mutationResolver) UpdateEntryViewCount(ctx context.Context, id *int, slug *string) (*model.CountUpdate, error) {
return controller.UpdateEntryViewCount(ctx, id, slug)
}
// EntrySaveUpdate is the resolver for the EntrySaveUpdate field.
func (r *mutationResolver) EntrySaveUpdate(ctx context.Context, input model.EntrySave) (string, error) {
return controller.EntrySaveUpdate(ctx, &input)
}
// ChannelList is the resolver for the ChannelList field.
func (r *queryResolver) ChannelList(ctx context.Context, filter *model.Filter, sort *model.Sort) (*model.ChannelDetails, error) {
return controller.ChannelList(ctx, filter, sort)
}
// ChannelDetail is the resolver for the ChannelDetail field.
func (r *queryResolver) ChannelDetail(ctx context.Context, channelID *int, channelSlug *string, isActive *bool) (*model.Channel, error) {
return controller.ChannelDetails(ctx, channelID, channelSlug, isActive)
}
// ChannelEntriesList is the resolver for the ChannelEntriesList field.
func (r *queryResolver) ChannelEntriesList(ctx context.Context, commonFilter *model.Filter, sort *model.Sort, entryFilter *model.EntriesFilter, additionalData *model.EntriesAdditionalData) (*model.ChannelEntryDetails, error) {
return controller.ChannelEntriesList(ctx, commonFilter, sort, entryFilter, additionalData)
}
// ChannelEntryDetail is the resolver for the ChannelEntryDetail field.
func (r *queryResolver) ChannelEntryDetail(ctx context.Context, id *int, slug *string, additionalData *model.EntriesAdditionalData, channelID *int, memberID *int) (*model.ChannelEntries, error) {
return controller.ChannelEntryDetail(ctx, id, slug, additionalData, channelID, memberID)
}
// TopAuthorsList is the resolver for the TopAuthorsList field.
func (r *queryResolver) TopAuthorsList(ctx context.Context, id *string) ([]*model.Author, error) {
return controller.TopAuthorsList(ctx, id)
}
// Mutation returns graph.MutationResolver implementation.
func (r *Resolver) Mutation() graph.MutationResolver { return &mutationResolver{r} }
type mutationResolver struct{ *Resolver }
-21
View File
@@ -1,21 +0,0 @@
package resolvers
// This file will be automatically regenerated based on the schema, any resolver implementations
// will be copied through when generating and any unknown code will be moved to the end.
// Code generated by github.com/99designs/gqlgen version v0.17.66
import (
"context"
"spurt-cms/graphql/controller"
"spurt-cms/graphql/model"
)
// CourseList is the resolver for the CourseList field.
func (r *queryResolver) CourseList(ctx context.Context, tenantID *string, status *int, categoryID *int) (*model.CourseLists, error) {
return controller.CourseList(ctx, tenantID, status, categoryID)
}
// CoursedetailList is the resolver for the CoursedetailList field.
func (r *queryResolver) CoursedetailList(ctx context.Context, tenantID *string, courseID *int) (*model.CourseDetails, error) {
return controller.CourseDetails(ctx, tenantID, courseID)
}
-77
View File
@@ -1,77 +0,0 @@
package resolvers
// This file will be automatically regenerated based on the schema, any resolver implementations
// will be copied through when generating and any unknown code will be moved to the end.
// Code generated by github.com/99designs/gqlgen version v0.17.66
import (
"context"
"spurt-cms/graphql/controller"
"spurt-cms/graphql/model"
)
// MemberRegister is the resolver for the memberRegister field.
func (r *mutationResolver) MemberRegister(ctx context.Context, input model.MemberDetails, arguments *model.MemberArguments) (bool, error) {
return controller.MemberRegister(ctx, &input, arguments)
}
// MemberCheckLogin is the resolver for the memberCheckLogin field.
func (r *mutationResolver) MemberCheckLogin(ctx context.Context, input model.MemberSignin) (*model.MemberCheckLoginResponse, error) {
return controller.MemberLogin(ctx, &input)
}
// ForgotPassword is the resolver for the forgotPassword field.
func (r *mutationResolver) ForgotPassword(ctx context.Context, input model.MemberInfo) (*model.ForgotPasswordResponse, error) {
return controller.ForgotPassword(ctx, &input)
}
// ResetPassword is the resolver for the resetPassword field.
func (r *mutationResolver) ResetPassword(ctx context.Context, input model.MemberResetpassInfo) (bool, error) {
return controller.ResetPassword(ctx, &input)
}
// MemberSocialLogin is the resolver for the memberSocialLogin field.
func (r *mutationResolver) MemberSocialLogin(ctx context.Context, input model.SocialLoginInput) (*model.SocialLoginResponse, error) {
return controller.MemberSocialLogin(ctx, &input)
}
// UpdateMemberProfile is the resolver for the updateMemberProfile field.
func (r *mutationResolver) UpdateMemberProfile(ctx context.Context, input model.UpdateMember) (*model.UpdatememberResponse, error) {
return controller.UpdateMemberProfile(ctx, &input)
}
// MembersList is the resolver for the MembersList field.
func (r *queryResolver) MembersList(ctx context.Context, filter *model.Filter) (*model.MembersDetails, error) {
return controller.MembersList(ctx, filter)
}
// MemberProfileDetails is the resolver for the MemberProfileDetails field.
func (r *queryResolver) MemberProfileDetails(ctx context.Context, id int) (*model.Members, error) {
return controller.MemberProfileDetails(ctx, &id)
}
// !!! WARNING !!!
// The code below was going to be deleted when updating resolvers. It has been copied here so you have
// one last chance to move it out of harms way if you want. There are two reasons this happens:
// - When renaming or deleting a resolver the old code will be put in here. You can safely delete
// it when you're done.
// - You have helper methods in this file. Move them out to keep these resolver files clean.
/*
func (r *mutationResolver) MemberCheckoutDetails(ctx context.Context, checkouts model.MemberCheckoutDetails) (string, error) {
return controller.CreateCheckoutDetails(ctx, &checkouts)
}
func (r *queryResolver) MembershipLevelList(ctx context.Context, filter *model.Filter, tenantID *string) (*model.MemershipDetail, error) {
return controller.MembershipLevelList(ctx, filter, tenantID)
// panic(fmt.Errorf("not implemented: MembershipLevelList - MembershipLevelList"))
}
func (r *queryResolver) MembershipLevelDetails(ctx context.Context, subscriptionid *int, tenantID *string) (*model.MemershipDetail, error) {
return controller.MembershipLevelDetails(ctx, subscriptionid, tenantID)
// panic(fmt.Errorf("not implemented: MembershipLevelDetails - MembershipLevelDetails"))
}
func (r *queryResolver) Integration(ctx context.Context, tenantID *string) (*model.ListIntegration, error) {
return controller.IntegrationList(ctx, tenantID)
// panic(fmt.Errorf("not implemented: Integration - Integration"))
}
*/
-7
View File
@@ -1,7 +0,0 @@
package resolvers
// This file will not be regenerated automatically.
//
// It serves as dependency injection for your app, add any dependencies you require here.
type Resolver struct{}
-68
View File
@@ -1,68 +0,0 @@
package routes
import (
"context"
"io/fs"
"os"
"path/filepath"
"spurt-cms/graphql/controller"
"spurt-cms/graphql/graph"
"spurt-cms/graphql/middleware"
"spurt-cms/graphql/resolvers"
"strings"
"github.com/99designs/gqlgen/graphql/handler"
"github.com/99designs/gqlgen/graphql/playground"
"github.com/gin-gonic/gin"
)
func GetEndpointHandlers(r *gin.Engine) *gin.Engine {
r.Static("/public", "./graphql/public")
var htmlFilePath []string
filepath.Walk("./graphql", func(path string, _ fs.FileInfo, _ error) error {
if strings.HasSuffix(path, ".html") {
htmlFilePath = append(htmlFilePath, path)
}
return nil
})
r.LoadHTMLFiles(htmlFilePath...)
// r.Use(middleware.LimitRequestBodySize(20 << 20))
r.Use(middleware.CorsMiddleware())
r.GET("/image-resize", controller.ImageResize)
r.GET("/", func(c *gin.Context) {
h := playground.Handler("GraphQL playground", os.Getenv("GRAPHQL_API_URL"))
h.ServeHTTP(c.Writer, c.Request)
})
r.POST("/query", func(c *gin.Context) {
execSchema := graph.NewExecutableSchema(graph.Config{Resolvers: &resolvers.Resolver{}, Directives: graph.DirectiveRoot{Auth: middleware.AuthMiddleware}})
srv := handler.NewDefaultServer(execSchema)
ctx := context.WithValue(c.Request.Context(), controller.GinContext, c)
srv.ServeHTTP(c.Writer, c.Request.WithContext(ctx))
})
r.GET("/apidocs", func(c *gin.Context) {
c.HTML(200, "spectaqldocs.html", nil)
})
return r
}
-24
View File
@@ -1,24 +0,0 @@
package scalars
import (
"encoding/json"
)
// Define the maximum length for your string
// const MaxLength int = 1000000000000000000
// CustomString is a custom scalar for strings with length constraints
type CustomString string
func (s *CustomString) UnmarshalJSON(data []byte) error {
var str string
if err := json.Unmarshal(data, &str); err != nil {
return err
}
*s = CustomString(str)
return nil
}
func (s CustomString) MarshalJSON() ([]byte, error) {
return json.Marshal(s)
}
-43
View File
@@ -1,43 +0,0 @@
type Category{
id: Int!
categoryName: String!
categorySlug: String!
description: String!
imagePath: String!
createdOn: Time!
createdBy: Int!
modifiedOn: Time
modifiedBy: Int
parentId: Int!
tenantId: String!
}
type CategoryDetails{
categorylist: [Category!]!
count: Int!
}
type GeneralInfo{
companyName:String!
logoPath:String!
expandLogoPath:String!
tenantId:String!
}
extend type Query{
CategoryList(categoryFilter: CategoryFilter,commonFilter: Filter): CategoryDetails! @auth
GeneralInformation(tenantId:String):GeneralInfo! @auth
}
input CategoryFilter{
categoryGroupId: Int
hierarchyLevel: Int
excludeGroup: Boolean
excludeParent: Boolean
exactLevelOnly: Boolean
checkEntriesPresence: Boolean
categoryGroupSlug: String
channelSlug: String
}
-213
View File
@@ -1,213 +0,0 @@
directive @auth on FIELD_DEFINITION
scalar Time
scalar CustomString
type Channel{
id: Int!
channelName: String!
channelDescription: String!
slugName: String!
fieldGroupId: Int!
isActive: Int!
createdOn: Time!
createdBy: Int!
isDeleted: Int!
modifiedOn: Time
modifiedBy: Int
tenantId: String!
}
type ChannelDetails{
channellist: [Channel!]!
count: Int!
}
type ChannelEntryDetails{
channelEntriesList: [ChannelEntries!]!
count: Int!
}
type ChannelEntries{
id: Int!
title: String!
slug: String!
description: CustomString!
userId: Int!
channelId: Int!
status: Int!
isActive: Int!
createdOn: Time!
createdBy: Int!
modifiedBy: Int
modifiedOn: Time
coverImage: String!
thumbnailImage: String!
metaTitle: String!
metaDescription: String!
keyword: String!
categoriesId: String!
relatedArticles: String!
featuredEntry: Int!
viewCount: Int!
author: String
sortOrder: Int
createTime: Time
publishedTime: Time
readingTime: Int
tags: String
excerpt: String
imageAltTag: String
categories: [[Category!]!]
additionalFields: AdditionalFields
authorDetails: Author
memberProfile: MemberProfile
tenantId: String!
contentChunk: Chunk
ctaLink: String
savedFlag: Boolean
PreviewLink: String
Uuid: String
}
type Author{
id: Int!
firstName: String!
lastName: String!
email: String!
mobileNo: String
isActive: Int
profileImagePath: String
createdOn: Time!
createdBy: Int!
modifiedOn: Time
modifiedBy: Int
tenantId: String!
roleId: Int
roleName: String
NameString: String
}
type AdditionalFields{
sections: [Section!]
fields: [Field!]
}
type Section{
id: Int!
sectionName: String!
sectionTypeId: Int!
createdOn: Time!
createdBy: Int!
modifiedOn: Time
modifiedBY: Int
orderIndex: Int!
tenantId: String!
}
type Field{
id: Int!
fieldName: String!
fieldTypeId: Int!
mandatoryField: Int!
optionExist: Int!
createdOn: Time!
createdBy: Int!
modifiedOn: Time
modifiedBY: Int
fieldDesc: String!
orderIndex: Int!
imagePath: String!
datetimeFormat: String
timeFormat: String
sectionParentId: Int
characterAllowed: Int
fieldTypeName: String!
fieldValue: FieldValue
fieldOptions: [FieldOptions!]
tenantId: String!
}
type FieldValue{
id: Int!
fieldValue: String!
createdOn: Time!
createdBy: Int!
modifiedOn: Time
modifiedBY: Int
tenantId: String!
}
type FieldOptions{
id: Int!
optionName: String!
optionValue: String!
createdOn: Time!
createdBy: Int!
modifiedOn: Time
modifiedBY: Int
tenantId: String!
}
type CountUpdate{
count: Int!
status: Boolean!
}
type Chunk{
data: [String!]!
length: Int!
}
input EntrySave{
entryId: Int!
userId: Int!
tenantId: String!
save: Boolean!
}
extend type Query{
ChannelList(filter: Filter,sort: Sort): ChannelDetails! @auth
ChannelDetail(channelId: Int,channelSlug: String,isActive: Boolean): Channel @auth
ChannelEntriesList(commonFilter: Filter,sort: Sort,entryFilter: EntriesFilter,AdditionalData: EntriesAdditionalData): ChannelEntryDetails! @auth
ChannelEntryDetail(id: Int, slug: String,AdditionalData: EntriesAdditionalData,channelId:Int,memberId:Int): ChannelEntries! @auth
TopAuthorsList(id:String):[Author] @auth
}
extend type Mutation{
UpdateEntryViewCount(id: Int,slug: String): CountUpdate! @auth
EntrySaveUpdate(input: EntrySave!):String! @auth
}
input Filter{
limit: Int
offset: Int
isActive: Boolean
keyword: String
location: String
Experience: String
posteddate: String
}
input EntriesFilter{
channelId: Int
categoryId: Int
categorySlug: String
getChildCategories: Boolean
Status: String
ChannelName: String
}
input EntriesAdditionalData{
authorDetails: Boolean
memberProfile: Boolean
additionalFields: Boolean
categories: Boolean
savedList: Boolean
MemberId: Int
}
input Sort{
sortBy: String
order: Int
}
-49
View File
@@ -1,49 +0,0 @@
type Course{
id: Int!
title: String!
description: String!
imageName: String!
imagePath: String!
category: Int!
tenantId: String!
}
type CourseLists{
courselist: [Course!]!
count: Int!
}
type Lesson{
id: Int!
courseId: Int!
sectionId: Int!
title: String!
content: String!
embedLink: String!
fileName: String!
filePath: String!
lessonType: String!
orderIndex: Int!
tenantId: String!
}
type Sections{
id: Int!
courseId: Int!
title: String!
content: String!
orderIndex: Int!
tenantId: String!
}
type CourseDetails{
lesson: [Lesson!]!
section: [Sections!]!
}
extend type Query{
CourseList(tenantId:String,status:Int,categoryId:Int): CourseLists! @auth
CoursedetailList(tenantId:String,courseId:Int): CourseDetails! @auth
}
-186
View File
@@ -1,186 +0,0 @@
scalar Any
type MemberProfile{
id: Int!
memberId: Int!
profileName: String!
profileSlug: String!
profilePage: String
memberDetails: Any
companyName: String
companyLocation: String
companyLogo: String
about: String
seoTitle: String
seoDescription: String
seoKeyword: String
linkedin: String
twitter: String
website: String
createdBy: Int
createdOn: Time
modifiedOn: Time
modifiedBy: Int
claimStatus: Int
IsActive: Int
tenantId: String!
claimDate: Time
}
type MemberSettings {
id: Int!
allowRegistration: Int!
memberLogin: String!
modifiedBy: Int
modifiedOn: Time
notificationUsers: String!
tenantId: String!
}
input MemberInfo{
email: String!
tenantId: String!
url: String!
}
input MemberResetpassInfo{
newPassword: String!
confrimPassword: String!
token: String!
}
input MemberSignin{
email: String!
password: String!
userId: Int!
tenantId: String!
}
type MemberCheckLoginResponse {
email:Boolean!
password:Boolean!
message: String!
token:String!
success: Boolean!
memberDetails: Members
}
type ForgotPasswordResponse{
message: String!
success:Boolean!
}
extend type Mutation{
memberRegister(input: MemberDetails!,arguments: MemberArguments):Boolean! @auth
memberCheckLogin(input:MemberSignin!): MemberCheckLoginResponse! @auth
forgotPassword(input: MemberInfo!):ForgotPasswordResponse!@auth
resetPassword(input: MemberResetpassInfo!):Boolean! @auth
memberSocialLogin(input: SocialLoginInput!): SocialLoginResponse! @auth
updateMemberProfile(input:UpdateMember!): UpdatememberResponse! @auth
}
type UpdatememberResponse{
memberDetails: Members!
message: String!
}
input SocialLoginInput{
firstName: String!
lastName: String
email: String!
password: String
username: String
}
type SocialLoginResponse{
message: String!
token:String!
userid:Int!
}
input MemberDetails{
id: Int
firstName: String!
lastName: String
mobile: String
email: String!
password: String!
isActive: Int
profileImage: String
profileImagePath: String
username: String
groupId: Int
userId: Int!
tenantId: String!
message: String
}
input MemberArguments{
module: Int
tenantId: String
}
type Members{
Id: Int
firstName: String!
lastName: String
mobile: String
email: String!
password: String!
isActive: Int
profileImage: String
profileImagePath: String
username: String
groupId: Int
createdBy: Int
createdOn: Time
modifiedOn: Time
modifiedBy: Int
tenantId: String!
isDeleted: Int!
storageType: String
NameString: String
}
input UpdateMember{
Id: Int!
firstName: String!
lastName: String
mobile: String!
email: String!
password: String
isActive: Int
profileImage: String
profileImagePath: String
username: String
groupId: Int
createdBy: Int
createdOn: Time
modifiedOn: Time
modifiedBy: Int
tenantId: String
removeImage: Boolean
}
type MembersDetails{
membersList: [Members!]!
count: Int!
}
extend type Query{
MembersList(filter: Filter): MembersDetails! @auth
MemberProfileDetails(id:Int!):Members! @auth
}
-27
View File
@@ -1,27 +0,0 @@
package graphql
import (
"log"
"os"
"spurt-cms/graphql/routes"
"sync"
"github.com/gin-gonic/gin"
)
func RunGraphqlServer(wg *sync.WaitGroup) {
defer wg.Done()
port := os.Getenv("GRAPHQL_PORT")
r := gin.Default()
REngine := routes.GetEndpointHandlers(r)
if err := REngine.Run(":" + port); err != nil{
log.Fatal("")
}
}
-13
View File
@@ -1,13 +0,0 @@
introspection:
schemaFile: ./spectaql/schema.graphqls
info:
title: "Spurtcms API Documentation"
description: "This is the API documentation for spurtcms Admin"
servers:
- url: http://devspurtcms.com:8084/query
description: Development Server
spectaql:
logoFile: ./spectaql/logo.png
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

-285
View File
@@ -1,285 +0,0 @@
# GraphQL schema example
#
# https://gqlgen.com/getting-started/
directive @auth on FIELD_DEFINITION
scalar Time
scalar Any
scalar CustomString
type Channel{
id: Int!
channelName: String!
channelDescription: String!
slugName: String!
fieldGroupId: Int!
isActive: Int!
createdOn: Time!
createdBy: Int!
isDeleted: Int!
modifiedOn: Time
modifiedBy: Int
tenantId: Int!
}
type ChannelDetails{
channellist: [Channel!]!
count: Int!
}
type ChannelEntryDetails{
channelEntriesList: [ChannelEntries!]!
count: Int!
}
type ChannelEntries{
id: Int!
title: String!
slug: String!
description: CustomString!
userId: Int!
channelId: Int!
status: Int!
isActive: Int!
createdOn: Time!
createdBy: Int!
modifiedBy: Int
modifiedOn: Time
coverImage: String!
thumbnailImage: String!
metaTitle: String!
metaDescription: String!
keyword: String!
categoriesId: String!
relatedArticles: String!
featuredEntry: Int!
viewCount: Int!
author: String
sortOrder: Int
createTime: Time
publishedTime: Time
readingTime: Int
tags: String
excerpt: String
imageAltTag: String
categories: [[Category!]!]
additionalFields: AdditionalFields
authorDetails: Author
memberProfile: MemberProfile
tenantId: Int!
contentChunk: Chunk
}
type Author{
id: Int!
firstName: String!
lastName: String!
email: String!
mobileNo: String
isActive: Int
profileImagePath: String
createdOn: Time!
createdBy: Int!
modifiedOn: Time
modifiedBy: Int
tenantId: Int!
}
type AdditionalFields{
sections: [Section!]
fields: [Field!]
}
type Section{
id: Int!
sectionName: String!
sectionTypeId: Int!
createdOn: Time!
createdBy: Int!
modifiedOn: Time
modifiedBY: Int
orderIndex: Int!
tenantId: Int!
}
type Field{
id: Int!
fieldName: String!
fieldTypeId: Int!
mandatoryField: Int!
optionExist: Int!
createdOn: Time!
createdBy: Int!
modifiedOn: Time
modifiedBY: Int
fieldDesc: String!
orderIndex: Int!
imagePath: String!
datetimeFormat: String
timeFormat: String
sectionParentId: Int
characterAllowed: Int
fieldTypeName: String!
fieldValue: FieldValue
fieldOptions: [FieldOptions!]
tenantId: Int!
}
type FieldValue{
id: Int!
fieldValue: String!
createdOn: Time!
createdBy: Int!
modifiedOn: Time
modifiedBY: Int
tenantId: Int!
}
type FieldOptions{
id: Int!
optionName: String!
optionValue: String!
createdOn: Time!
createdBy: Int!
modifiedOn: Time
modifiedBY: Int
tenantId: Int!
}
type CountUpdate{
count: Int!
status: Boolean!
}
type Chunk{
data: [String!]!
length: Int!
}
type MemberProfile{
id: Int!
memberId: Int!
profileName: String!
profileSlug: String!
profilePage: String
memberDetails: Any
companyName: String
companyLocation: String
companyLogo: String
about: String
seoTitle: String
seoDescription: String
seoKeyword: String
linkedin: String
twitter: String
website: String
createdBy: Int
createdOn: Time
modifiedOn: Time
modifiedBy: Int
claimStatus: Int
IsActive: Int
tenantId: Int!
claimDate: Time
}
type MemberSettings {
id: Int!
allowRegistration: Int!
memberLogin: String!
modifiedBy: Int
modifiedOn: Time
notificationUsers: String!
tenantId: Int!
}
type Category{
id: Int!
categoryName: String!
categorySlug: String!
description: String!
imagePath: String!
createdOn: Time!
createdBy: Int!
modifiedOn: Time
modifiedBy: Int
parentId: Int!
tenantId: Int!
}
type CategoryDetails{
categorylist: [Category!]!
count: Int!
}
type Query{
ChannelList(filter: Filter,sort: Sort): ChannelDetails! @auth
ChannelDetail(channelId: Int,channelSlug: String,isActive: Boolean): Channel @auth
ChannelEntriesList(commonFilter: Filter,sort: Sort,entryFilter: EntriesFilter,AdditionalData: EntriesAdditionalData): ChannelEntryDetails! @auth
ChannelEntryDetail(id: Int, slug: String,AdditionalData: EntriesAdditionalData): ChannelEntries! @auth
CategoryList(categoryFilter: CategoryFilter,commonFilter: Filter): CategoryDetails! @auth
}
type Mutation{
UpdateEntryViewCount(id: Int,slug: String): CountUpdate! @auth
memberRegister(input: MemberDetails!,arguments: MemberArguments):Boolean!
}
input Filter{
limit: Int
offset: Int
isActive: Boolean
keyword: String
}
input EntriesFilter{
channelId: Int
categoryId: Int
categorySlug: String
getChildCategories: Boolean
Status: String
}
input EntriesAdditionalData{
authorDetails: Boolean
memberProfile: Boolean
additionalFields: Boolean
categories: Boolean
}
input Sort{
sortBy: String
order: Int
}
input MemberDetails{
firstName: String!
lastName: String
mobile: String
email: String!
password: String
isActive: Int
profileImage: String
profileImagePath: String
username: String
groupId: Int
}
input MemberArguments{
module: Int
tenantId: Int
}
input CategoryFilter{
categoryGroupId: Int
hierarchyLevel: Int
excludeGroup: Boolean
excludeParent: Boolean
exactLevelOnly: Boolean
checkEntriesPresence: Boolean
categoryGroupSlug: String
}
-8
View File
@@ -1,8 +0,0 @@
//go:build tools
package tools
import (
_ "github.com/99designs/gqlgen"
_ "github.com/99designs/gqlgen/graphql/introspection"
)
-1
View File
@@ -1 +0,0 @@
package helper
-2096
View File
File diff suppressed because it is too large Load Diff
+190 -189
View File
@@ -152,9 +152,9 @@
"getsupport": "Get SpurtCMS Pro",
"explore": "Explore",
"aiwritingheading": "Generate AI-powered content with customization.",
"selling":"Selling",
"courses":"Courses",
"listing":"Listing",
"selling": "Selling",
"courses": "Courses",
"listing": "Listing",
"Setting": {
"title": "Settings",
"manageroles": "Manage Roles",
@@ -241,7 +241,7 @@
"rolelable": "Your role in the system, assigned by the admin, defining your access level.",
"emaillable": "Your registered email address for communication and login purposes.",
"mobilelable": "Your Phone number that will be used for contact and communication.",
"aimodule": "AI Module Settings"
"aimodule": "AI Model Settings"
},
"Emailtemplate": {
"searchtemplates": "Search Templates",
@@ -1079,7 +1079,6 @@
"Product Deleted Successfully": "Product deleted successfully",
"Product Updated Successfully": "Product updated successfully",
"memstatusnotify": "Member status updated successfully",
"Order Deleted Successfully": "Order deleted successfully",
"User access permission changed Successfully": "User access permission changed successfully",
"User status changed Successfully": "User status changed successfully",
"Product Status Changed Successfully": "Product status changed successfully",
@@ -1148,38 +1147,38 @@
"SubscriptionCreatedSuccessfully": "Subscription created successfully",
"SubscriptionUpdaredSuccessfully": "Subscription updated successfully",
"SubscriptionDeletedSuccessfully": "Subscription deleted successfully",
"AI Module Created Successfully": "AI Module Created Successfully",
"AI Module Created Successfully": "AI Model Created Successfully",
"Status Changed Successfully": "Status Changed Successfully",
"AI Module Updated Successfully": "AI Module Updated Successfully",
"AI Module Deleted Successfully": "AI Module Deleted Successfully",
"IntegrationUpdatedSuccessfully": "Integration Updated Successfully",
"AI Module Updated Successfully": "AI Model Updated Successfully",
"AI Module Deleted Successfully": "AI Model Deleted Successfully",
"Integration Updated Successfully": "Integration Updated Successfully",
"Course Created Successfully": "Course Created Successfully",
"Course Deleted Successfully": "Course Deleted Successfully",
"Section Created Successfully":"Section Created Successfully",
"Section Updated Successfully":"Section Updated Successfully",
"Section Deleted Successfully":"Section Deleted Successfully",
"Lesson Created Successfully":"Lesson Created Successfully",
"Lesson Updated Successfully":"Lesson Updated Successfully",
"Lesson Deleted Successfully":"Lesson Deleted Successfully",
"Course Published Successfully":"Course Published Successfully",
"Course Unpublished Successfully":"Course Unpublished Successfully",
"Course Settings Updated Successfully":"Course Settings Updated Successfully",
"Integrationreapt":"This Integration Already existing ",
"Menu Created Successfully":"Menu Created Successfully",
"Menu Updated Successfully":"Menu Updated Successfully",
"Menu Deleted Successfully":"Menu Deleted Successfully",
"Template Updated Successfully":"Template Updated Successfully",
"SEO Details Updated Successfully":"SEO Details Updated Successfully",
"Settings Details Updated Successfully":"Settings Details Updated Successfully",
"Listing Deleted Successfully":"Listing Deleted Successfully",
"Listing Created Successfully":"Listing Created Successfully",
"Listing Updated Successfully":"Listing Updated Successfully",
"Website Deleted Successfully":"Website Deleted Successfully",
"Website Created Successfully":"Website Created Successfully",
"Website Updated Successfully":"Website Updated Successfully",
"Page Created Successfully":"Page Created Successfully",
"Page Updated Successfully":"Page Updated Successfully",
"Page Deleted Successfully":"Page Deleted Successfully"
"Section Created Successfully": "Section Created Successfully",
"Section Updated Successfully": "Section Updated Successfully",
"Section Deleted Successfully": "Section Deleted Successfully",
"Lesson Created Successfully": "Lesson Created Successfully",
"Lesson Updated Successfully": "Lesson Updated Successfully",
"Lesson Deleted Successfully": "Lesson Deleted Successfully",
"Course Published Successfully": "Course Published Successfully",
"Course Unpublished Successfully": "Course Unpublished Successfully",
"Course Settings Updated Successfully": "Course Settings Updated Successfully",
"Integrationreapt": "This Integration Already existing ",
"Menu Created Successfully": "Menu Created Successfully",
"Menu Updated Successfully": "Menu Updated Successfully",
"Menu Deleted Successfully": "Menu Deleted Successfully",
"Template Updated Successfully": "Template Updated Successfully",
"SEO Details Updated Successfully": "SEO Details Updated Successfully",
"Settings Details Updated Successfully": "Settings Details Updated Successfully",
"Listing Deleted Successfully": "Listing Deleted Successfully",
"Listing Created Successfully": "Listing Created Successfully",
"Listing Updated Successfully": "Listing Updated Successfully",
"Website Deleted Successfully": "Website Deleted Successfully",
"Website Created Successfully": "Website Created Successfully",
"Website Updated Successfully": "Website Updated Successfully",
"Page Created Successfully": "Page Created Successfully",
"Page Updated Successfully": "Page Updated Successfully",
"Page Deleted Successfully": "Page Deleted Successfully"
},
"DashBoard": {
"lastactive": "Last Active",
@@ -1705,7 +1704,7 @@
"timezoneerror": "Please select the time zone",
"countryhead": "Country",
"countryplaceholder": "Enter your country",
"countryerror": "Please select the country",
"countryerror": "Please select the country",
"dechead": "Describe",
"decplaceholder": "Describe your needs for our precise assistance to you",
"decerror": "Please enter the description",
@@ -1965,7 +1964,7 @@
"membershiplevelemptydesc": "No membership tiers found! Define and customize membership tiers with different access levels and subscription plans.",
"deletemembershiplevel": "Delete Membership Level ?",
"areyousure": "Are you sure you want to delete this Membership Level ?",
"membershipdesc":"Description"
"membershipdesc": "Description"
},
"subscriptions": {
"create": "Create Subscription",
@@ -2137,8 +2136,8 @@
"AImodulesettings": {
"cancel": "Cancel",
"save": "Save",
"create": "Create New AI Module",
"aimodule": "AI Module",
"create": "Create New AI Model",
"aimodule": "AI Model",
"description": "Description",
"lastupdatedon": "Last Updated on",
"status": "Status",
@@ -2146,9 +2145,9 @@
"action": "Action",
"edit": "Edit",
"delete": "Delete",
"aiemptytitle": "No AI Settings Module found?",
"aiemptytitle": "No AI Settings Model found?",
"aiemptydesc": "Enhance your system with AI-powered automation and intelligence.Choose a provider,configure settings,and get started today!",
"selectmodule": "Select Module",
"selectmodule": "Select Model",
"selectmoduledesc": "Easily integrate AI capabilities by selecting a module, adding an API key, and defining the AI model.",
"openai": "Open AI",
"openaidesc": "Utilize state-of-the-art natural language processing for automated content creation and intelligent responses.",
@@ -2161,7 +2160,7 @@
"descriptionplaceholder": "Please Enter Description",
"aimodel": "AI Model",
"selectaimodel": "Select AI Model",
"aimodelerr":"Please Select AI Model"
"aimodelerr": "Please Select AI Model"
},
"Securitys": {
"security": "Security",
@@ -2175,49 +2174,49 @@
"confirmpasswordinfo": "Re-enter the new password to ensure accuracy and prevent errors."
},
"Course": {
"course":"Course",
"manageandorganize":"Manage and organize educational content effortlessly.",
"createcourse":"Create Course",
"recordsavailable":"Records Available",
"all":"All",
"selectfilters":"Select Filters",
"coursetitle":"Course Title",
"entercoursetitle":"Enter Course Title",
"status":"Status",
"selectstatus":"Select Status",
"pricing":"Pricing",
"selectpricing":"Select Pricing",
"clear":"Clear",
"applyfilter":"Apply Filter",
"sortby":"Sort By",
"lastupdated":"Last Updated",
"createddate":"Created Date",
"ascending":"Ascending",
"descending":"Descending",
"createdBy":"Created By",
"action":"Action",
"lastupdatedon":"Last Updated on ",
"createdon":"Created on",
"publish":"Publish",
"unpublish":"Unpublish",
"delete":"Delete",
"cancel":"Cancel",
"save":"Save",
"title":"Title",
"enteryourtitle":"Enter Your Title",
"titleinfo":"Enter a unique and descriptive title for your course.",
"description":"Description",
"enteryourdescription":"Enter Your Description",
"descriptioninfo":"Provide a detailed summary of the course, highlighting key topics and objectives.",
"category":"Category",
"categoryinfo":"Select an appropriate category to organize your course for easy discoverability.",
"selectcategory":"Select Category",
"searchcategory":"Search Category",
"uploadcoverimage":"Upload Cover Image",
"uploadcoverimageinfo":"Choose an image to visually represent your course.",
"browse":"Browse",
"uploadnewfiles":"Upload new files or choose from directory",
"chooseonly":"Choose only jpg/jpeg/png formats",
"course": "Course",
"manageandorganize": "Manage and organize educational content effortlessly.",
"createcourse": "Create Course",
"recordsavailable": "Records Available",
"all": "All",
"selectfilters": "Select Filters",
"coursetitle": "Course Title",
"entercoursetitle": "Enter Course Title",
"status": "Status",
"selectstatus": "Select Status",
"pricing": "Pricing",
"selectpricing": "Select Pricing",
"clear": "Clear",
"applyfilter": "Apply Filter",
"sortby": "Sort By",
"lastupdated": "Last Updated",
"createddate": "Created Date",
"ascending": "Ascending",
"descending": "Descending",
"createdBy": "Created By",
"action": "Action",
"lastupdatedon": "Last Updated on ",
"createdon": "Created on",
"publish": "Publish",
"unpublish": "Unpublish",
"delete": "Delete",
"cancel": "Cancel",
"save": "Save",
"title": "Title",
"enteryourtitle": "Enter Your Title",
"titleinfo": "Enter a unique and descriptive title for your course.",
"description": "Description",
"enteryourdescription": "Enter Your Description",
"descriptioninfo": "Provide a detailed summary of the course, highlighting key topics and objectives.",
"category": "Category",
"categoryinfo": "Select an appropriate category to organize your course for easy discoverability.",
"selectcategory": "Select Category",
"searchcategory": "Search Category",
"uploadcoverimage": "Upload Cover Image",
"uploadcoverimageinfo": "Choose an image to visually represent your course.",
"browse": "Browse",
"uploadnewfiles": "Upload new files or choose from directory",
"chooseonly": "Choose only jpg/jpeg/png formats",
"nocoursesyet": "No Courses Yet!",
"startcreating": "Start creating engaging learning experiences today! Add courses that are of a great learning experiences to your learners.",
"deletecourse": "Delete Course?",
@@ -2246,107 +2245,109 @@
"createsection": "Create Section",
"updatesection": "Update Section"
},
"Coursessettings":{
"settings":"Settings",
"details":"Details",
"title":"Title",
"titledesc":"Enter a clear and concise title for the course.",
"description":"Description",
"desccont":"Provide a detailed overview of the course, including key topics and learning outcomes.",
"image":"Image",
"imagedesc":"Upload a cover image that represents the course. Choose a high-quality image for better engagement.",
"chooseimg":"Choose Image",
"category":"Category",
"catdesc":"Select the appropriate category to classify the course for easy discovery.",
"searchcat":"Seach Categories",
"options":"Options",
"certificate":"Certificate",
"cerdesc":"Enable this option if you want to provide a certificate upon course completion.",
"cerstatus":"Provide Certificate for this course",
"comments":"Comments",
"commentsdesc":"Provide any information about pre-requisites for the study of this course or special instructions to the learners.",
"active":"Active",
"inactive":"In active",
"pricing":"Pricing",
"offer":"Offer",
"offerdesc":"Select the pricing model for your course - free, waitlist, or paid.",
"offerchange":"Change Offer Options",
"free":"Free",
"freedesc":"The course is available to learners at no cost.",
"waitlist":"Waitlist",
"waitlistdesc":"Learners can register, but access is provided later.",
"paid":"Paid",
"paiddesc":"The course requires a payment to enroll.",
"availability":"Availability",
"status":"Status",
"statusdesc":"Set the course as active or inactive.",
"visibility":"Visibility",
"visibilitydesc":"Define who can view and enroll in the course.",
"published":"Published",
"unpublish":"Unpublished",
"draft":"Draft",
"selectvisible":"Select Visibility",
"public":"Public",
"private":"Private",
"startdate":"Start Date",
"datedesc":"Set a specific date when the course becomes available.",
"singuplimit":"Sign-up limit",
"singuplimitdesc":"Specify a maximum number of students allowed for the course.",
"enterlimits":"Enter Limits",
"duration":"Duration",
"durationdesc":"Determine how long the course remains accessible after enrollment.",
"selectduration":"Select Duration",
"month":"Month",
"year":"Year",
"visiblityerr":"Please choose visibility",
"dateerr":"Please choose specific date",
"limiterr":"Please Enter Maximum SignUpLimits",
"durationerr":"Please choose Course Duration",
"pricemodelerr":"Please Select the pricing model for your course"
},
"Menu":{
"website":"Website",
"templates":"Templates",
"seo":"SEO",
"setting":"Setting",
"webdesc":"Customize your website and let your brand shine",
"bannertitle":"Powerful Website Management Tools",
"bannerdesc":"Easily build and customize your website using intuitive controls and flexible templates. The Website tab lets you organize pages, set up navigation, and ensure your content is always up-to-date—helping you deliver a seamless experience for your visitors.",
"menu":"Menu",
"menuname":"Menu Name",
"totalitems":"Total Items",
"status":"Status",
"lastmodified":"Last Modified",
"action":"Action",
"createmenu":"Create Menu",
"createnewmenu":"Create New Menu",
"description":"Description",
"managemenu":"Manage Menu",
"managemenudesc":"Manage menu options and settings",
"choosemenuitem":"Choose Menu Items",
"addmenuitems":"Add Menu Items",
"addtomenu":"Add to menu",
"mostrecent":"Most recent",
"viewall":"View all",
"selectall":"Select All",
"addmenuitem":"Add Menu Item",
"labelname":"Label Name",
"labelnameplcholder":"Enter label name",
"navigationpath":"Navigation path",
"navplcholder":"Give link path",
"additem":"Add item",
"labelnameerr":"Please Enter Label Name",
"linkpatherr":" Please Enter Link Path",
"menunameerr":"Please Enter Menu Name",
"nameduplicateerr":"Menu Name already exists",
"descriptionerror":"Please Enter Menu Description",
"namelimiterr":"Please Enter 15 Character only",
"pathlimiterr":"Please Enter 30 Character only",
"removeconfirmation":"Are you sure you want to remove this Menu",
"deletemenu":"Delete Menu",
"deselectall":"DeselectAll"
},
"Seo": {
"Coursessettings": {
"settings": "Settings",
"details": "Details",
"title": "Title",
"titledesc": "Enter a clear and concise title for the course.",
"description": "Description",
"desccont": "Provide a detailed overview of the course, including key topics and learning outcomes.",
"image": "Image",
"imagedesc": "Upload a cover image that represents the course. Choose a high-quality image for better engagement.",
"chooseimg": "Choose Image",
"category": "Category",
"catdesc": "Select the appropriate category to classify the course for easy discovery.",
"searchcat": "Seach Categories",
"options": "Options",
"certificate": "Certificate",
"cerdesc": "Enable this option if you want to provide a certificate upon course completion.",
"cerstatus": "Provide Certificate for this course",
"comments": "Comments",
"commentsdesc": "Provide any information about pre-requisites for the study of this course or special instructions to the learners.",
"active": "Active",
"inactive": "In active",
"pricing": "Pricing",
"offer": "Offer",
"offerdesc": "Select the pricing model for your course - free, waitlist, or paid.",
"offerchange": "Change Offer Options",
"free": "Free",
"freedesc": "The course is available to learners at no cost.",
"waitlist": "Waitlist",
"waitlistdesc": "Learners can register, but access is provided later.",
"paid": "Paid",
"paiddesc": "The course requires a payment to enroll.",
"availability": "Availability",
"status": "Status",
"statusdesc": "Set the course as active or inactive.",
"visibility": "Visibility",
"visibilitydesc": "Define who can view and enroll in the course.",
"published": "Published",
"unpublish": "Unpublished",
"draft": "Draft",
"selectvisible": "Select Visibility",
"public": "Public",
"private": "Private",
"startdate": "Start Date",
"datedesc": "Set a specific date when the course becomes available.",
"singuplimit": "Sign-up limit",
"singuplimitdesc": "Specify a maximum number of students allowed for the course.",
"enterlimits": "Enter Limits",
"duration": "Duration",
"durationdesc": "Determine how long the course remains accessible after enrollment.",
"selectduration": "Select Duration",
"month": "Month",
"year": "Year",
"visiblityerr": "Please choose visibility",
"dateerr": "Please choose specific date",
"limiterr": "Please Enter Maximum SignUpLimits",
"durationerr": "Please choose Course Duration",
"pricemodelerr": "Please Select the pricing model for your course"
},
"Menu": {
"website": "Website",
"templates": "Templates",
"seo": "SEO",
"setting": "Setting",
"webdesc": "Customize your website and let your brand shine",
"bannertitle": "Powerful Website Management Tools",
"bannerdesc": "Easily build and customize your website using intuitive controls and flexible templates. The Website tab lets you organize pages, set up navigation, and ensure your content is always up-to-date—helping you deliver a seamless experience for your visitors.",
"menu": "Menu",
"menuname": "Menu Name",
"totalitems": "Total Items",
"status": "Status",
"lastmodified": "Last Modified",
"action": "Action",
"createmenu": "Create Menu",
"createnewmenu": "Create New Menu",
"description": "Description",
"managemenu": "Manage Menu",
"managemenudesc": "Manage menu options and settings",
"choosemenuitem": "Choose Menu Items",
"addmenuitems": "Add Menu Items",
"addtomenu": "Add to menu",
"mostrecent": "Most recent",
"viewall": "View all",
"selectall": "Select All",
"addmenuitem": "Add Menu Item",
"labelname": "Menu Item Name",
"labelnameplcholder": "Enter Menu Item name",
"navigationpath": "Navigation path",
"navplcholder": "Give link path",
"additem": "Add Item",
"labelnameerr": "Please Enter Menu Item Name",
"linkpatherr": " Please Enter Link Path",
"menunameerr": "Please Enter Menu Name",
"nameduplicateerr": "Menu Name already exists",
"descriptionerror": "Please Enter Menu Description",
"namelimiterr": "Please Enter 35 Character only",
"pathlimiterr": "Please Enter 30 Character only",
"removeconfirmation": "Are you sure you want to remove this Menu",
"deletemenu": "Delete Menu",
"deselectall": "DeselectAll",
"separatewindow":"Open as seperate window"
},
"Seo": {
"homepage": "Home Page",
"pagetitle": "Page Title",
"homepagetitle": "Home Page Title",
@@ -2369,9 +2370,9 @@
"pleaseentertitle": "Please Enter Title",
"pleaseenterdescripion": "Please Enter Description",
"pleaseenterkeyword": "Please Enter Keyword",
"titlemustnotexceed55characters": "Title must not exceed 55 characters",
"descriptionmustnotexceed155characters": "Description must not exceed 155 characters",
"keywordmustnotexceed155characters": "Keyword must not exceed 155 characters",
"titlemustnotexceed55characters": "Title must not exceed 95 characters",
"descriptionmustnotexceed155characters": "Description must not exceed 250 characters",
"keywordmustnotexceed155characters": "Keyword must not exceed 250 characters",
"pleasechooseimage": "Please Choose Image"
},
"WebsiteSettings": {
@@ -2385,6 +2386,6 @@
"pleaseenteryoursitename": "Please Enter Your SiteName",
"maximumlength20": "Maximum length must be 20 characters",
"pleaseenteryourwebsiteurl": "Please Enter Your Website URL",
"onlylowercaselettersandnumbersareallowed":"Only lowercase letters and numbers are allowed"
"onlylowercaselettersandnumbersareallowed": "Only lowercase letters and numbers are allowed"
}
}
+5 -4
View File
@@ -2319,6 +2319,7 @@
"labelname": "Nombre de la Etiqueta",
"labelnameplcholder": "Ingrese el nombre de la etiqueta",
"navigationpath": "Ruta de navegación",
"separatewindow":"Abrir como ventana separada",
"navplcholder": "Ingrese la ruta del enlace",
"additem": "Agregar elemento",
"labelnameerr": "Por favor, ingrese el nombre de la etiqueta",
@@ -2326,7 +2327,7 @@
"menunameerr": "Por favor, ingrese el nombre del menú",
"nameduplicateerr": "El nombre del menú ya existe",
"descriptionerror": "Por favor, ingrese la descripción del menú",
"namelimiterr": "Por favor, ingrese solo 15 caracteres",
"namelimiterr": "Por favor, ingrese solo 35 caracteres",
"pathlimiterr": "Por favor, ingrese solo 30 caracteres",
"removeconfirmation": "¿Está seguro de que desea eliminar este menú?",
"deletemenu": "Eliminar menú",
@@ -2355,9 +2356,9 @@
"pleaseentertitle": "Por Favor Ingrese el Título",
"pleaseenterdescripion": "Por Favor Ingrese la Descripción",
"pleaseenterkeyword": "Por Favor Ingrese la Palabra Clave",
"titlemustnotexceed55characters": "El Título No Debe Exceder los 55 Caracteres",
"descriptionmustnotexceed155characters": "La Descripción No Debe Exceder los 155 Caracteres",
"keywordmustnotexceed155characters": "La Palabra Clave No Debe Exceder los 155 Caracteres",
"titlemustnotexceed55characters": "El Título No Debe Exceder los 95 Caracteres",
"descriptionmustnotexceed155characters": "La Descripción No Debe Exceder los 250 Caracteres",
"keywordmustnotexceed155characters": "La Palabra Clave No Debe Exceder los 250 Caracteres",
"pleasechooseimage": "Por Favor Elija una Imagen"
},
"WebsiteSettings": {
+5 -4
View File
@@ -2317,6 +2317,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",
"navplcholder": "Indiquez le chemin du lien",
"additem": "Ajouter un élément",
"labelnameerr": "Veuillez entrer le nom de l'étiquette",
@@ -2324,7 +2325,7 @@
"menunameerr": "Veuillez entrer le nom du menu",
"nameduplicateerr": "Le nom du menu existe déjà",
"descriptionerror": "Veuillez entrer la description du menu",
"namelimiterr": "Veuillez entrer seulement 15 caractères",
"namelimiterr": "Veuillez entrer seulement 35 caractères",
"pathlimiterr": "Veuillez entrer seulement 30 caractères",
"removeconfirmation": "Êtes-vous sûr de vouloir supprimer ce menu ?",
"deletemenu": "Supprimer le menu",
@@ -2353,9 +2354,9 @@
"pleaseentertitle": "Por Favor Ingrese el Título",
"pleaseenterdescripion": "Por Favor Ingrese la Descripción",
"pleaseenterkeyword": "Por Favor Ingrese la Palabra Clave",
"titlemustnotexceed55characters": "El Título No Debe Exceder los 55 Caracteres",
"descriptionmustnotexceed155characters": "La Descripción No Debe Exceder los 155 Caracteres",
"keywordmustnotexceed155characters": "La Palabra Clave No Debe Exceder los 155 Caracteres",
"titlemustnotexceed55characters": "El Título No Debe Exceder los 95 Caracteres",
"descriptionmustnotexceed155characters": "La Descripción No Debe Exceder los 250 Caracteres",
"keywordmustnotexceed155characters": "La Palabra Clave No Debe Exceder los 250 Caracteres",
"pleasechooseimage": "Por Favor Elija una Imagen"
},
"WebsiteSettings": {
+2373 -2372
View File
File diff suppressed because it is too large Load Diff
-74
View File
@@ -1,74 +0,0 @@
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
}
-356
View File
@@ -1,356 +0,0 @@
ERROR 2025/10/04 10:12:43 forms_builder.go:109: unable to fetch the template module list: record not found
ERROR 2025/10/04 10:18:34 template_menu_controller.go:432: checkmenugroupname error: record not found
ERROR 2025/10/04 11:11:00 auth_controller.go:947: set new password error: record not found
ERROR 2025/10/04 11:13:42 auth_controller.go:177: CheckLogin error: invalid password
ERROR 2025/10/04 11:28:38 auth_controller.go:177: CheckLogin error: invalid password
ERROR 2025/10/04 11:29:44 auth_controller.go:177: CheckLogin error: invalid password
ERROR 2025/10/04 11:30:58 auth_controller.go:177: CheckLogin error: invalid password
ERROR 2025/10/04 11:31:19 forms_builder.go:109: unable to fetch the template module list: record not found
ERROR 2025/10/04 14:59:45 forms_builder.go:109: unable to fetch the template module list: record not found
ERROR 2025/10/04 14:59:55 forms_builder.go:109: unable to fetch the template module list: record not found
ERROR 2025/10/04 15:41:46 forms_builder.go:109: unable to fetch the template module list: record not found
ERROR 2025/10/04 15:41:57 category_controller.go:679: checkcategorygroupname error: record not found
ERROR 2025/10/04 15:42:11 category_controller.go:721: CheckSubCategoryName error: record not found
ERROR 2025/10/04 15:42:42 forms_builder.go:109: unable to fetch the template module list: record not found
ERROR 2025/10/04 15:51:48 forms_builder.go:109: unable to fetch the template module list: record not found
ERROR 2025/10/04 15:52:15 entries_controller.go:1175: edit entry get member details error: record not found
ERROR 2025/10/04 15:52:15 entries_controller.go:1181: edit entry get channeldetails error: record not found
ERROR 2025/10/04 15:59:50 forms_builder.go:109: unable to fetch the template module list: record not found
ERROR 2025/10/04 16:17:08 general_settings.go:58: Getting data from general settings Error:record not found
ERROR 2025/10/04 18:36:21 auth_controller.go:177: CheckLogin error: invalid password
ERROR 2025/10/06 10:34:23 category_controller.go:679: checkcategorygroupname error: record not found
ERROR 2025/10/06 10:34:40 category_controller.go:721: CheckSubCategoryName error: record not found
ERROR 2025/10/06 10:34:47 category_controller.go:721: CheckSubCategoryName error: record not found
ERROR 2025/10/06 10:34:47 category_controller.go:721: CheckSubCategoryName error: record not found
ERROR 2025/10/06 10:35:44 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/06 10:35:44 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/06 10:36:43 forms_builder.go:109: unable to fetch the template module list: record not found
ERROR 2025/10/06 10:36:50 forms_builder.go:109: unable to fetch the template module list: record not found
ERROR 2025/10/06 10:36:56 forms_builder.go:1098: unable to fetch the template module list: record not found
ERROR 2025/10/06 10:37:09 forms_builder.go:109: unable to fetch the template module list: record not found
ERROR 2025/10/06 10:37:19 forms_builder.go:109: unable to fetch the template module list: record not found
ERROR 2025/10/06 14:03:16 category_controller.go:679: checkcategorygroupname error: record not found
ERROR 2025/10/06 14:03:31 category_controller.go:721: CheckSubCategoryName error: record not found
ERROR 2025/10/06 14:03:47 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/06 14:03:47 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/06 14:11:11 channels_controller.go:452: getchannel error: %!s(<nil>)
ERROR 2025/10/06 14:11:11 entries_controller.go:1175: edit entry get member details error: record not found
ERROR 2025/10/06 14:37:54 forms_builder.go:109: unable to fetch the template module list: record not found
ERROR 2025/10/06 14:40:03 forms_builder.go:109: unable to fetch the template module list: record not found
ERROR 2025/10/06 14:40:23 forms_builder.go:109: unable to fetch the template module list: record not found
ERROR 2025/10/06 14:41:18 template_menu_controller.go:162: courselist error :Error 1146 (42S02): Table 'Community.tbl_courses' doesn't exist
ERROR 2025/10/06 14:41:31 template_menu_controller.go:162: courselist error :Error 1146 (42S02): Table 'Community.tbl_courses' doesn't exist
ERROR 2025/10/06 14:41:31 template_menu_controller.go:162: courselist error :Error 1146 (42S02): Table 'Community.tbl_courses' doesn't exist
ERROR 2025/10/06 15:14:44 auth_controller.go:177: CheckLogin error: invalid password
ERROR 2025/10/06 15:21:38 auth_controller.go:177: CheckLogin error: invalid password
ERROR 2025/10/06 15:22:11 auth_controller.go:177: CheckLogin error: invalid password
ERROR 2025/10/06 15:27:59 ai_assistance_controller.go:340: createEntry channel data error: record not found
ERROR 2025/10/06 16:49:06 forms_builder.go:109: unable to fetch the template module list: record not found
ERROR 2025/10/06 16:58:20 category_controller.go:679: checkcategorygroupname error: record not found
ERROR 2025/10/06 16:58:33 category_controller.go:721: CheckSubCategoryName error: record not found
ERROR 2025/10/06 16:58:47 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/06 16:58:47 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/06 16:59:38 channels_controller.go:452: getchannel error: %!s(<nil>)
ERROR 2025/10/06 16:59:38 entries_controller.go:1146: edit entry get member details error: record not found
ERROR 2025/10/06 16:59:40 forms_builder.go:109: unable to fetch the template module list: record not found
ERROR 2025/10/06 16:59:54 forms_builder.go:1098: unable to fetch the template module list: record not found
ERROR 2025/10/06 17:00:27 forms_builder.go:109: unable to fetch the template module list: record not found
ERROR 2025/10/13 17:54:02 auth_controller.go:177: CheckLogin error: record not found
ERROR 2025/10/13 17:55:07 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 17:56:29 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 17:56:42 entries_controller.go:855: publish entry authorization error: Unauthorized
ERROR 2025/10/13 17:56:42 entries_controller.go:557: all entries authorization error: Unauthorized
ERROR 2025/10/13 17:56:44 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:02:55 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/13 18:02:55 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/13 18:03:16 roles_permission_controller.go:326: check roles error: record not found
ERROR 2025/10/13 18:03:25 roles_permission_controller.go:326: check roles error: record not found
ERROR 2025/10/13 18:03:28 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:09:44 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/13 18:09:44 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/13 18:13:07 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/13 18:13:07 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/13 18:13:28 roles_permission_controller.go:326: check roles error: record not found
ERROR 2025/10/13 18:13:33 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:13:48 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/13 18:13:48 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/13 18:13:53 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:14:01 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:14:29 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:14:35 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:16:37 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/13 18:16:37 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/13 18:16:52 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:16:55 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:16:58 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:17:42 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:18:22 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:22:01 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:22:47 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/13 18:22:47 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/13 18:24:11 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/13 18:24:11 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/13 18:24:31 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/13 18:24:31 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/13 18:24:44 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/13 18:24:44 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/13 18:25:16 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/13 18:25:16 channels_controller.go:1478: Channels checkname error: record not found
ERROR 2025/10/13 18:35:32 auth_controller.go:177: CheckLogin error: record not found
ERROR 2025/10/13 18:35:43 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:41:31 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:41:31 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:41:31 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:41:32 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:41:32 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:41:32 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:41:32 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:41:32 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:41:32 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:41:32 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:41:43 entries_controller.go:857: publish entry authorization error: Unauthorized
ERROR 2025/10/13 18:41:43 entries_controller.go:559: all entries authorization error: Unauthorized
ERROR 2025/10/13 18:43:05 entries_controller.go:1152: edit entry get member details error: record not found
ERROR 2025/10/13 18:43:05 entries_controller.go:1158: edit entry get channeldetails error: record not found
ERROR 2025/10/13 18:43:55 entries_controller.go:1152: edit entry get member details error: record not found
ERROR 2025/10/13 18:43:55 entries_controller.go:1158: edit entry get channeldetails error: record not found
ERROR 2025/10/13 18:44:19 entries_controller.go:559: all entries authorization error: Unauthorized
ERROR 2025/10/13 18:44:39 entries_controller.go:1152: edit entry get member details error: record not found
ERROR 2025/10/13 18:46:39 entries_controller.go:1152: edit entry get member details error: record not found
ERROR 2025/10/13 18:46:48 entries_controller.go:1152: edit entry get member details error: record not found
ERROR 2025/10/13 18:47:02 entries_controller.go:559: all entries authorization error: Unauthorized
ERROR 2025/10/13 18:47:06 entries_controller.go:147: Entries authorization error: Unauthorized
ERROR 2025/10/13 18:47:06 entries_controller.go:1116: edit entry authorization error: Unauthorized
ERROR 2025/10/13 18:47:06 entries_controller.go:1152: edit entry get member details error: record not found
ERROR 2025/10/13 18:47:06 entries_controller.go:1158: edit entry get channeldetails error: record not found
ERROR 2025/10/13 18:51:26 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/13 18:51:27 entries_controller.go:1195: channelfield error: Unauthorized
ERROR 2025/10/13 18:51:32 entries_controller.go:857: publish entry authorization error: Unauthorized
ERROR 2025/10/13 18:51:32 entries_controller.go:559: all entries authorization error: Unauthorized
ERROR 2025/10/13 18:51:41 entries_controller.go:147: Entries authorization error: Unauthorized
ERROR 2025/10/13 18:51:41 entries_controller.go:1116: edit entry authorization error: Unauthorized
ERROR 2025/10/13 18:51:41 entries_controller.go:1152: edit entry get member details error: record not found
ERROR 2025/10/13 18:51:41 entries_controller.go:1158: edit entry get channeldetails error: record not found
ERROR 2025/10/13 18:58:29 entries_controller.go:147: Entries authorization error: Unauthorized
ERROR 2025/10/13 18:58:30 entries_controller.go:1116: edit entry authorization error: Unauthorized
ERROR 2025/10/13 18:58:30 entries_controller.go:1152: edit entry get member details error: record not found
ERROR 2025/10/13 18:58:30 entries_controller.go:1158: edit entry get channeldetails error: record not found
ERROR 2025/10/13 18:58:42 entries_controller.go:147: Entries authorization error: Unauthorized
ERROR 2025/10/13 18:58:43 entries_controller.go:1116: edit entry authorization error: Unauthorized
ERROR 2025/10/13 18:58:43 entries_controller.go:1152: edit entry get member details error: record not found
ERROR 2025/10/13 18:58:43 entries_controller.go:1158: edit entry get channeldetails error: record not found
ERROR 2025/10/13 18:58:44 entries_controller.go:559: all entries authorization error: Unauthorized
ERROR 2025/10/13 18:58:48 entries_controller.go:147: Entries authorization error: Unauthorized
ERROR 2025/10/13 18:58:49 entries_controller.go:1116: edit entry authorization error: Unauthorized
ERROR 2025/10/13 18:58:49 entries_controller.go:1152: edit entry get member details error: record not found
ERROR 2025/10/13 18:58:49 entries_controller.go:1158: edit entry get channeldetails error: record not found
ERROR 2025/10/13 18:58:53 entries_controller.go:559: all entries authorization error: Unauthorized
ERROR 2025/10/13 18:58:55 entries_controller.go:147: Entries authorization error: Unauthorized
ERROR 2025/10/13 18:58:55 entries_controller.go:1116: edit entry authorization error: Unauthorized
ERROR 2025/10/13 18:58:55 entries_controller.go:1152: edit entry get member details error: record not found
ERROR 2025/10/13 18:58:55 entries_controller.go:1158: edit entry get channeldetails error: record not found
ERROR 2025/10/13 18:59:13 entries_controller.go:559: all entries authorization error: Unauthorized
ERROR 2025/10/13 18:59:16 entries_controller.go:1030: edit entry page authorization error: Unauthorized
ERROR 2025/10/13 18:59:19 channels_controller.go:438: getfieldata authorization error: Unauthorized
ERROR 2025/10/13 18:59:19 entries_controller.go:1195: channelfield error: Unauthorized
ERROR 2025/10/13 18:59:19 entries_controller.go:1116: edit entry authorization error: Unauthorized
ERROR 2025/10/13 18:59:19 entries_controller.go:1152: edit entry get member details error: record not found
ERROR 2025/10/13 18:59:22 entries_controller.go:857: publish entry authorization error: Unauthorized
ERROR 2025/10/13 18:59:22 entries_controller.go:559: all entries authorization error: Unauthorized
ERROR 2025/10/13 18:59:34 entries_controller.go:147: Entries authorization error: Unauthorized
ERROR 2025/10/13 18:59:35 entries_controller.go:1116: edit entry authorization error: Unauthorized
ERROR 2025/10/13 18:59:35 entries_controller.go:1152: edit entry get member details error: record not found
ERROR 2025/10/13 18:59:35 entries_controller.go:1158: edit entry get channeldetails error: record not found
ERROR 2025/10/13 19:03:40 entries_controller.go:147: Entries authorization error: Unauthorized
ERROR 2025/10/13 19:03:43 entries_controller.go:1115: edit entry authorization error: Unauthorized
ERROR 2025/10/13 19:03:43 entries_controller.go:1151: edit entry get member details error: record not found
ERROR 2025/10/13 19:03:43 entries_controller.go:1157: edit entry get channeldetails error: record not found
ERROR 2025/10/13 19:03:44 entries_controller.go:558: all entries authorization error: Unauthorized
ERROR 2025/10/13 19:03:51 entries_controller.go:1151: edit entry get member details error: record not found
ERROR 2025/10/13 19:15:11 channels_controller.go:1207: Channels checkname error: record not found
ERROR 2025/10/13 19:15:11 channels_controller.go:1207: Channels checkname error: record not found
ERROR 2025/10/14 10:29:50 roles_permission_controller.go:326: check roles error: record not found
ERROR 2025/10/14 10:31:18 roles_permission_controller.go:326: check roles error: record not found
ERROR 2025/10/14 10:42:39 roles_permission_controller.go:326: check roles error: record not found
ERROR 2025/10/14 10:45:12 channels_controller.go:1213: Channels checkname error: record not found
ERROR 2025/10/14 10:45:12 channels_controller.go:1213: Channels checkname error: record not found
ERROR 2025/10/14 10:45:35 roles_permission_controller.go:326: check roles error: record not found
ERROR 2025/10/14 10:45:53 channels_controller.go:1213: Channels checkname error: record not found
ERROR 2025/10/14 10:45:53 channels_controller.go:1213: Channels checkname error: record not found
ERROR 2025/10/14 10:46:26 roles_permission_controller.go:326: check roles error: record not found
ERROR 2025/10/14 10:47:15 channels_controller.go:1213: Channels checkname error: record not found
ERROR 2025/10/14 10:47:15 channels_controller.go:1213: Channels checkname error: record not found
ERROR 2025/10/14 10:47:41 roles_permission_controller.go:326: check roles error: record not found
ERROR 2025/10/14 10:59:02 auth_controller.go:177: CheckLogin error: record not found
ERROR 2025/10/14 10:59:09 auth_controller.go:177: CheckLogin error: record not found
ERROR 2025/10/14 10:59:16 auth_controller.go:177: CheckLogin error: record not found
ERROR 2025/10/14 10:59:28 auth_controller.go:177: CheckLogin error: record not found
ERROR 2025/10/14 10:59:35 auth_controller.go:177: CheckLogin error: record not found
ERROR 2025/10/14 10:59:55 auth_controller.go:177: CheckLogin error: record not found
ERROR 2025/10/14 11:00:07 auth_controller.go:177: CheckLogin error: record not found
ERROR 2025/10/14 11:00:29 auth_controller.go:177: CheckLogin error: record not found
ERROR 2025/10/14 11:00:44 auth_controller.go:177: CheckLogin error: record not found
ERROR 2025/10/14 11:02:56 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/14 11:49:50 roles_permission_controller.go:326: check roles error: record not found
ERROR 2025/10/14 11:50:13 user_controller.go:323: check email error: record not found
ERROR 2025/10/14 11:50:13 user_controller.go:342: check number error: record not found
ERROR 2025/10/14 11:50:14 user_controller.go:305: Create Team email notification status not enabled
ERROR 2025/10/14 11:50:32 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/14 11:50:32 entries_controller.go:257: createEntry channel data error: record not found
ERROR 2025/10/14 11:50:32 entries_controller.go:298: block collection list authorization error: Unauthorized
ERROR 2025/10/14 11:50:32 entries_controller.go:302: block authorization error: Unauthorized
ERROR 2025/10/14 11:52:59 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/14 11:52:59 entries_controller.go:298: block collection list authorization error: Unauthorized
ERROR 2025/10/14 11:52:59 entries_controller.go:302: block authorization error: Unauthorized
ERROR 2025/10/14 11:56:04 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/14 11:56:04 entries_controller.go:298: block collection list authorization error: Unauthorized
ERROR 2025/10/14 11:56:04 entries_controller.go:302: block authorization error: Unauthorized
ERROR 2025/10/14 11:57:25 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/14 11:57:25 entries_controller.go:298: block collection list authorization error: Unauthorized
ERROR 2025/10/14 11:57:25 entries_controller.go:302: block authorization error: Unauthorized
ERROR 2025/10/14 12:00:47 entries_controller.go:239: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:00:47 entries_controller.go:293: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:00:47 entries_controller.go:297: block authorization error: Unauthorized
ERROR 2025/10/14 12:01:31 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:01:31 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:01:31 entries_controller.go:296: block authorization error: Unauthorized
ERROR 2025/10/14 12:02:18 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:02:18 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:02:18 entries_controller.go:296: block authorization error: Unauthorized
ERROR 2025/10/14 12:03:07 roles_permission_controller.go:326: check roles error: record not found
ERROR 2025/10/14 12:03:12 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:10:27 roles_permission_controller.go:326: check roles error: record not found
ERROR 2025/10/14 12:10:36 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:10:36 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:11:02 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:11:02 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:11:33 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:11:33 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:11:40 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:11:40 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:16:16 roles_permission_controller.go:326: check roles error: record not found
ERROR 2025/10/14 12:16:20 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:16:20 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:16:47 roles_permission_controller.go:326: check roles error: record not found
ERROR 2025/10/14 12:16:56 roles_permission_controller.go:326: check roles error: record not found
ERROR 2025/10/14 12:17:00 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:17:00 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:18:43 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:18:43 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:18:44 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:18:44 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:18:46 entries_controller.go:1162: channelfield error: Unauthorized
ERROR 2025/10/14 12:18:49 entries_controller.go:824: publish entry authorization error: Unauthorized
ERROR 2025/10/14 12:18:49 entries_controller.go:526: all entries authorization error: Unauthorized
ERROR 2025/10/14 12:18:58 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:18:58 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:18:59 entries_controller.go:1162: channelfield error: Unauthorized
ERROR 2025/10/14 12:19:20 roles_permission_controller.go:326: check roles error: record not found
ERROR 2025/10/14 12:19:23 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:19:23 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:19:24 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:19:24 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:19:26 entries_controller.go:1162: channelfield error: Unauthorized
ERROR 2025/10/14 12:19:30 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:19:30 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:19:31 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:19:31 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:19:34 entries_controller.go:1162: channelfield error: Unauthorized
ERROR 2025/10/14 12:19:41 entries_controller.go:824: publish entry authorization error: Unauthorized
ERROR 2025/10/14 12:19:41 entries_controller.go:526: all entries authorization error: Unauthorized
ERROR 2025/10/14 12:19:52 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:19:52 entries_controller.go:256: createEntry channel data error: record not found
ERROR 2025/10/14 12:19:52 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:21:38 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:21:38 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:21:39 entries_controller.go:1162: channelfield error: Unauthorized
ERROR 2025/10/14 12:21:55 channels_controller.go:1213: Channels checkname error: record not found
ERROR 2025/10/14 12:21:55 channels_controller.go:1213: Channels checkname error: record not found
ERROR 2025/10/14 12:22:26 roles_permission_controller.go:326: check roles error: record not found
ERROR 2025/10/14 12:22:31 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:22:31 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:22:33 entries_controller.go:1162: channelfield error: Unauthorized
ERROR 2025/10/14 12:22:34 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:22:34 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:22:36 entries_controller.go:1162: channelfield error: Unauthorized
ERROR 2025/10/14 12:22:40 entries_controller.go:1162: channelfield error: Unauthorized
ERROR 2025/10/14 12:23:09 entries_controller.go:526: all entries authorization error: Unauthorized
ERROR 2025/10/14 12:23:54 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:23:54 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:23:56 entries_controller.go:1162: channelfield error: Unauthorized
ERROR 2025/10/14 12:23:58 channels_controller.go:234: createchannel authorization error: Unauthorized
ERROR 2025/10/14 12:24:00 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:24:00 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:24:02 entries_controller.go:1162: channelfield error: Unauthorized
ERROR 2025/10/14 12:28:18 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:28:18 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:28:19 entries_controller.go:1144: channelfield error: Unauthorized
ERROR 2025/10/14 12:28:24 entries_controller.go:806: publish entry authorization error: Unauthorized
ERROR 2025/10/14 12:28:24 entries_controller.go:526: all entries authorization error: Unauthorized
ERROR 2025/10/14 12:28:30 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:28:30 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:28:32 entries_controller.go:1144: channelfield error: Unauthorized
ERROR 2025/10/14 12:41:12 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 12:41:12 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 12:41:13 entries_controller.go:1144: channelfield error: Unauthorized
ERROR 2025/10/14 12:45:42 forms_builder.go:109: unable to fetch the template module list: record not found
ERROR 2025/10/14 13:04:13 roles_permission_controller.go:326: check roles error: record not found
ERROR 2025/10/14 13:04:38 user_controller.go:323: check email error: record not found
ERROR 2025/10/14 13:04:38 user_controller.go:342: check number error: record not found
ERROR 2025/10/14 13:04:39 user_controller.go:305: Create Team email notification status not enabled
ERROR 2025/10/14 13:05:24 auth_controller.go:177: CheckLogin error: user disabled please contact admin
ERROR 2025/10/14 13:08:08 channels_controller.go:395: editchannel authorization error: Unauthorized
ERROR 2025/10/14 13:08:13 channels_controller.go:395: editchannel authorization error: Unauthorized
ERROR 2025/10/14 13:08:17 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 13:08:17 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 13:08:18 entries_controller.go:1144: channelfield error: Unauthorized
ERROR 2025/10/14 13:08:31 entries_controller.go:806: publish entry authorization error: Unauthorized
ERROR 2025/10/14 13:08:31 entries_controller.go:526: all entries authorization error: Unauthorized
ERROR 2025/10/14 13:08:34 entries_controller.go:979: edit entry page authorization error: Unauthorized
ERROR 2025/10/14 13:08:36 channels_controller.go:438: getfieldata authorization error: Unauthorized
ERROR 2025/10/14 13:08:36 entries_controller.go:1065: edit entry authorization error: Unauthorized
ERROR 2025/10/14 13:08:36 entries_controller.go:1144: channelfield error: Unauthorized
ERROR 2025/10/14 13:08:36 entries_controller.go:1101: edit entry get member details error: record not found
ERROR 2025/10/14 13:08:39 entries_controller.go:806: publish entry authorization error: Unauthorized
ERROR 2025/10/14 13:08:40 entries_controller.go:526: all entries authorization error: Unauthorized
ERROR 2025/10/14 13:09:10 entries_controller.go:147: Entries authorization error: Unauthorized
ERROR 2025/10/14 13:09:11 entries_controller.go:1065: edit entry authorization error: Unauthorized
ERROR 2025/10/14 13:09:11 entries_controller.go:1101: edit entry get member details error: record not found
ERROR 2025/10/14 13:09:11 entries_controller.go:1107: edit entry get channeldetails error: record not found
ERROR 2025/10/14 14:29:44 roles_permission_controller.go:326: check roles error: record not found
ERROR 2025/10/14 14:30:32 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 14:30:32 entries_controller.go:256: createEntry channel data error: record not found
ERROR 2025/10/14 14:30:32 entries_controller.go:292: block collection list authorization error: Unauthorized
ERROR 2025/10/14 14:36:13 roles_permission_controller.go:326: check roles error: record not found
ERROR 2025/10/14 14:36:46 user_controller.go:323: check email error: record not found
ERROR 2025/10/14 14:36:46 user_controller.go:342: check number error: record not found
ERROR 2025/10/14 14:36:47 user_controller.go:305: Create Team email notification status not enabled
ERROR 2025/10/14 14:39:17 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 14:39:17 entries_controller.go:242: Entries authorization error: Unauthorized
ERROR 2025/10/14 14:39:31 roles_permission_controller.go:326: check roles error: record not found
ERROR 2025/10/14 14:39:36 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 14:39:36 entries_controller.go:242: Entries authorization error: Unauthorized
ERROR 2025/10/14 14:39:39 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 14:39:39 entries_controller.go:242: Entries authorization error: Unauthorized
ERROR 2025/10/14 14:45:16 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 14:45:17 entries_controller.go:290: block collection list authorization error: Unauthorized
ERROR 2025/10/14 14:45:18 entries_controller.go:1142: channelfield error: Unauthorized
ERROR 2025/10/14 14:45:28 channels_controller.go:234: createchannel authorization error: Unauthorized
ERROR 2025/10/14 14:45:44 entries_controller.go:238: create Entry authorization error: Unauthorized
ERROR 2025/10/14 14:45:44 entries_controller.go:290: block collection list authorization error: Unauthorized
ERROR 2025/10/14 14:45:45 entries_controller.go:1142: channelfield error: Unauthorized
ERROR 2025/10/14 14:47:39 roles_permission_controller.go:326: check roles error: record not found
ERROR 2025/10/14 14:47:42 entries_controller.go:237: create Entry authorization error: Unauthorized
ERROR 2025/10/14 14:47:42 entries_controller.go:295: block collection list authorization error: Unauthorized
ERROR 2025/10/14 14:47:46 entries_controller.go:237: create Entry authorization error: Unauthorized
ERROR 2025/10/14 14:47:46 entries_controller.go:295: block collection list authorization error: Unauthorized
ERROR 2025/10/14 14:47:52 entries_controller.go:237: create Entry authorization error: Unauthorized
ERROR 2025/10/14 14:47:52 entries_controller.go:242: Entries authorization error: Unauthorized
ERROR 2025/10/14 14:48:13 entries_controller.go:237: create Entry authorization error: Unauthorized
ERROR 2025/10/14 14:48:13 entries_controller.go:295: block collection list authorization error: Unauthorized
ERROR 2025/10/14 15:20:29 auth_controller.go:177: CheckLogin error: user disabled please contact admin
ERROR 2025/10/14 15:21:07 auth_controller.go:177: CheckLogin error: user disabled please contact admin
ERROR 2025/10/14 17:27:30 user_controller.go:323: check email error: record not found
ERROR 2025/10/14 17:27:30 user_controller.go:342: check number error: record not found
ERROR 2025/10/14 18:31:53 general_settings.go:58: Getting data from general settings Error:record not found
ERROR 2025/10/23 12:16:21 forms_builder.go:109: unable to fetch the template module list: record not found
-52
View File
@@ -1,52 +0,0 @@
package main
import (
"os"
"spurt-cms/controllers"
"spurt-cms/graphql"
"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(4)
go RunAdminPanel(&wg)
go templateview.RunTemplateView(&wg)
go graphql.RunGraphqlServer(&wg)
wg.Wait()
}
-4169
View File
File diff suppressed because it is too large Load Diff
-220
View File
@@ -1,220 +0,0 @@
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
}
-78
View File
@@ -1,78 +0,0 @@
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()
}
}
-65
View File
@@ -1,65 +0,0 @@
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
}
}
}
-526
View File
@@ -1,526 +0,0 @@
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, gotemp_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 err := db.Table("tbl_go_templates").Count(&gotemp_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))
}
if gotemp_count > 0 {
var gotempMaxid int
if err := db.Raw("SELECT max(id) FROM tbl_go_templates").Row().Scan(&gotempMaxid); err != nil {
// Handle error
log.Println(err)
}
db.Exec(fmt.Sprintf("ALTER SEQUENCE tbl_go_templates_id_seq RESTART WITH %d", gotempMaxid+1))
}
}
fmt.Println("SQL file loaded successfully.")
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-113
View File
@@ -1,113 +0,0 @@
package models
import (
"time"
)
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"`
}
-134
View File
@@ -1,134 +0,0 @@
package models
import (
"time"
chn "github.com/spurtcms/channels"
"gorm.io/gorm"
)
var IST, _ = time.LoadLocation("Asia/Kolkata")
type TblCategory struct {
Id int
CategoryName string
CategorySlug string
Description string
ImagePath string
CreatedOn time.Time
CreatedBy int
ModifiedOn time.Time `gorm:"DEFAULT:NULL"`
ModifiedBy int `gorm:"DEFAULT:NULL"`
IsDeleted int
DeletedOn time.Time `gorm:"DEFAULT:NULL"`
DeletedBy int `gorm:"DEFAULT:NULL"`
ParentId int
CreatedDate string `gorm:"-"`
ModifiedDate string `gorm:"-"`
DateString string `gorm:"-"`
ParentCategoryName string `gorm:"-"`
Parent []string `gorm:"-"`
ParentWithChild []Result `gorm:"-"`
}
type Result struct {
CategoryName string
}
type TblChannelEntries struct {
Id int
Title string `form:"title" binding:"required"`
Slug string `form:"slug" binding:"required"`
Description string
UserId int
ChannelId int
Status int //0-draft 1-publish 2-unpublish
IsActive int
IsDeleted int `gorm:"DEFAULT:0"`
DeletedBy int `gorm:"DEFAULT:NULL"`
DeletedOn time.Time `gorm:"DEFAULT:NULL"`
CreatedOn time.Time
CreatedBy int
ModifiedBy int `gorm:"DEFAULT:NULL"`
ModifiedOn time.Time `gorm:"DEFAULT:NULL"`
CoverImage string
ThumbnailImage string
MetaTitle string `form:"metatitle" binding:"required"`
MetaDescription string `form:"metadesc" binding:"required"`
Keyword string `form:"keywords" binding:"required"`
CategoriesId string
RelatedArticles string
CreatedDate string `gorm:"-"`
ModifiedDate string `gorm:"-"`
Username string `gorm:"<-:false"`
TblChannelEntryField []TblChannelEntryField `gorm:"<-:false; foreignKey:ChannelEntryId"`
Category []TblCategory `gorm:"<-:false; foreignKey:Id"`
CategoryGroup string `gorm:"<-:false"`
ChannelName string `gorm:"<-:false"`
Cno int `gorm:"<-:false"`
}
type TblChannelEntryField struct {
Id int
FieldName string
FieldValue string
ChannelEntryId int
FieldId int
CreatedOn time.Time
CreatedBy int
ModifiedOn time.Time `gorm:"DEFAULT:NULL"`
ModifiedBy int `gorm:"DEFAULT:NULL"`
FieldTypeId int `gorm:"<-:false"`
}
type ExportData struct {
Title string
CreatedBy string
CreatedDate string
Status string
}
type TblModule struct {
Id int
ModuleName string
IsActive int
CreatedBy int
CreatedOn time.Time
CreatedDate string `gorm:"<-:false"`
DefaultModule int
ParentId int
IconPath string
OrderIndex int
Description string
DisplayName string `gorm:"column:display_name;<-:false"`
RouteName string `gorm:"column:route_name;<-:false"`
RouteParentId int `gorm:"column:parent_id;<-:false"`
FullAccessPermission int
GroupFlg int
}
func Exportentriesdata(exportdata *[]chn.Tblchannelentries, id []int, tenantid string) error {
if err := DB.Table("tbl_channel_entries").Select("tbl_channel_entries.*,tbl_users.username,tbl_channels.channel_name").Joins("inner join tbl_users on tbl_users.id = tbl_channel_entries.created_by").Joins("inner join tbl_channels on tbl_channels.id = tbl_channel_entries.channel_id").Where("tbl_channel_entries.is_deleted=0 and tbl_channel_entries.id IN ? and (tbl_channel_entries.tenant_id is NULL or tbl_channel_entries.tenant_id = ?)", id, tenantid).Order("tbl_channel_entries.id desc").Preload("TblChannelEntryField", func(db *gorm.DB) *gorm.DB {
return db.Select("tbl_channel_entry_fields.*,tbl_fields.field_type_id").Joins("inner join tbl_fields on tbl_fields.Id = tbl_channel_entry_fields.field_id")
}).Find(&exportdata).Error; err != nil {
return err
}
return nil
}
func Entryid(entry string, tenantid string) (Id int, err error) {
var modules TblModule
if err := DB.Table("tbl_modules").Where("module_name=? and parent_id!=?", entry, 0).First(&modules).Error; err != nil {
return 0, err
}
id := modules.Id
return id, nil
}
-33
View File
@@ -1,33 +0,0 @@
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
}

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