intial commit

This commit is contained in:
2026-05-25 11:45:56 +05:30
commit 6ab508560f
73 changed files with 23713 additions and 0 deletions

457
domain/userDomain.go Normal file
View File

@@ -0,0 +1,457 @@
package domain
import (
"nearle/db"
"nearle/models"
"nearle/utils"
"strconv"
"strings"
)
func Getuserbyid(uid int) models.UserInfo {
var user models.UserInfo
q1 := `SELECT a.userid,a.authname,a.email,a.configid,a.roleid,a.authmode,a.contactno,
a.firstname,a.lastname,concat(a.firstname,' ',a.lastname) as fullname,a.password,a.address,a.suburb,a.city,a.state,a.postcode,
a.userfcmtoken,a.pin,a.deviceid,a.devicetype,a.tenantid,a.shiftid,
a.applocationid,b.locationname as applocation,b.latitude as applatitude,b.longitude as applongitude, b.radius as appradius , concat(c.starttime, ' - ', c.endtime) as shiftname
from app_users a
INNER JOIN app_location b on a.applocationid=b.applocationid
LEFT JOIN ridershifts c ON a.shiftid = c.shiftid
WHERE a.userid= ` + strconv.Itoa(uid)
// print(q1)
db.DB.Raw(q1).Find(&user)
return user
}
func GetAllUsers(
roleID, configID, tenantID, pageno, pagesize int,
status, keyword string,
) []models.UserInfo {
var users []models.UserInfo
var params []interface{}
var queryBuilder strings.Builder
offset := (pageno - 1) * pagesize
queryBuilder.WriteString(`
SELECT
a.userid, a.authname, a.email, a.configid, a.roleid, a.authmode, a.contactno,
a.firstname, a.lastname, CONCAT(a.firstname, ' ', a.lastname) AS fullname,
a.address, a.suburb, a.city, a.state, a.postcode,
a.userfcmtoken, a.pin, a.deviceid, a.devicetype,
a.tenantid, a.status, a.shiftid, a.latitude, a.longitude,d.rolename,
STRING_AGG(
CONCAT(
ac.applocationid, '::',
al.locationname, '::',
ac.status
)::text, ','
) AS applocations_raw
FROM app_users a
LEFT JOIN app_locationconfig ac ON ac.userid = a.userid
LEFT JOIN app_location al ON al.applocationid = ac.applocationid
LEFT JOIN app_roles d ON a.roleid = d.roleid
WHERE 1=1
`)
if roleID != 0 {
queryBuilder.WriteString(" AND a.roleid = ?")
params = append(params, roleID)
}
if configID != 0 {
queryBuilder.WriteString(" AND a.configid = ?")
params = append(params, configID)
}
if tenantID != 0 {
queryBuilder.WriteString(" AND a.tenantid = ?")
params = append(params, tenantID)
}
if status != "" {
queryBuilder.WriteString(" AND a.status = ?")
params = append(params, status)
}
if keyword != "" {
queryBuilder.WriteString(`
AND (
LOWER(a.firstname) LIKE ? OR
LOWER(a.contactno) LIKE ? OR
LOWER(a.suburb) LIKE ?
)
`)
search := "%" + strings.ToLower(keyword) + "%"
params = append(params, search, search, search)
}
queryBuilder.WriteString(`
GROUP BY a.userid, d.rolename
ORDER BY a.userid DESC
LIMIT ? OFFSET ?
`)
params = append(params, pagesize, offset)
// ---------- TEMP STRUCT ----------
type tempUser struct {
models.UserInfo
ApplocationsRaw string `gorm:"column:applocations_raw"`
}
var temp []tempUser
db.DB.Raw(queryBuilder.String(), params...).Scan(&temp)
// ---------- MAP RESULT ----------
for _, t := range temp {
t.UserInfo.Applocations = []models.AppLocation{}
if t.ApplocationsRaw != "" {
items := strings.Split(t.ApplocationsRaw, ",")
for _, item := range items {
parts := strings.Split(item, "::")
if len(parts) == 3 {
id, err := strconv.Atoi(parts[0])
if err == nil {
t.UserInfo.Applocations = append(
t.UserInfo.Applocations,
models.AppLocation{
Applocationid: id,
Applocationname: parts[1],
Status: parts[2],
},
)
}
}
}
}
users = append(users, t.UserInfo)
}
return users
}
func GetTenantUserbyId(uid int) models.TenantUserInfo {
var user models.TenantUserInfo
q1 := `SELECT a.userid,a.authname,a.email,a.configid,a.roleid,a.authmode,a.contactno,
a.firstname,a.lastname,concat(a.firstname,' ',a.lastname) as fullname,
a.userfcmtoken,a.pin,a.deviceid,a.devicetype,a.tenantid,a.locationid,a.applocationid,
b.partnerid,b.moduleid,b.categoryid as categoryid,b.subcategoryid as subcategoryid,
b.applocationid,b.tenantname,b.address as tenantaddress,b.state as tenantstate,b.city as tenantcity,
b.postcode as tenantpostcode,b.latitude as tenantlat,b.longitude as tenantlong,c.locationname AS applocation,
c.latitude as applatitude,c.longitude as applongitude,c.radius as appradius, d.categoryname, e.locationname
from app_users a
LEFT JOIN tenants b ON a.tenantid=b.tenantid
INNER JOIN app_location c on c.applocationid=b.applocationid
LEFT JOIN app_category d ON b.categoryid=d.categoryid
LEFT JOIN tenantlocations e ON a.locationid=e.locationid
WHERE a.userid= ` + strconv.Itoa(uid)
// print(q1)
db.DB.Raw(q1).Find(&user)
return user
}
func GetTenantId(uid int, contactno string) int {
var tid int
var q1 string
if contactno != "" {
q1 = `select tenantid from tenants WHERE primarycontact='` + contactno + `'`
} else {
q1 = `select primarycontact from tenants WHERE primarycontact='` + contactno + `'`
}
db.DB.Raw(q1).Find(&tid)
return tid
}
func Getuserbyno(cno string) models.UserInfo {
var user models.UserInfo
q1 := `SELECT a.userid,a.authname,a.email,a.configid,a.roleid,a.authmode,a.contactno,
a.firstname,a.lastname,concat(a.firstname,' ',a.lastname) as fullname,
a.userfcmtoken,a.pin,a.deviceid,a.devicetype,a.tenantid,a.locationid,
b.partnerid,b.moduleid,b.categoryid as categoryid,b.subcategoryid as subcategoryid,
b.applocationid,b.tenantname,b.address as tenantaddress,b.state as tenantstate,b.city as tenantcity,
b.postcode as tenantpostcode,b.latitude as tenantlat,b.longitude as tenantlong
from app_users a
LEFT JOIN tenants b ON a.tenantid=b.tenantid
WHERE a.contactno= '` + cno + `'`
db.DB.Raw(q1).Find(&user)
return user
}
func GetPartnerUserbyid(uid int) models.UserInfo {
var user models.UserInfo
q1 := `SELECT a.userid,a.authname,a.email,a.configid,a.roleid,a.authmode,a.contactno,a.firstname,a.lastname,concat(a.firstname,' ',a.lastname) as fullname,
a.userfcmtoken,a.pin,a.deviceid,a.devicetype,a.tenantid,a.applocationid,a.partnerid,
b.locationname AS applocation,b.latitude AS applatitude,b.longitude AS applongitude,b.radius AS appradius, b.deliveryradius, c.partnername
from app_users a
INNER JOIN app_location b ON a.applocationid=b.applocationid
LEFT JOIN partnerinfo c ON a.partnerid=c.partnerid
WHERE a.userid= ` + strconv.Itoa(uid)
db.DB.Raw(q1).Find(&user)
return user
}
func GetRiderUserbyid(uid int) models.RiderInfo {
var user models.RiderInfo
q1 := `SELECT a.userid,a.authname,a.email,a.configid,a.roleid,a.authmode,a.contactno, a.address,a.state,a.city,a.postcode,a.latitude,a.longitude,
a.firstname,a.lastname,concat(a.firstname,' ',a.lastname) as username,a.userfcmtoken,a.pin,a.deviceid,a.devicetype,a.partnerid,a.applocationid, a.tenantid, a.locationid, a.shiftid,
b.starttime, b.endtime, b.shifthours, b.firstmilecharge, b.fuelcharge, c.logid, d.onduty, e.logseconds, e.deliveryradius
from app_users a
LEFT JOIN ridershifts b ON a.shiftid=b.shiftid
LEFT JOIN riderlogs c ON a.userid=c.userid
LEFT JOIN app_userpools d on a.userid=d.userid
LEFT JOIN app_location e on a.applocationid=e.applocationid
WHERE a.userid= ` + strconv.Itoa(uid)
db.DB.Raw(q1).Find(&user)
utils.Logger.Debugf("Query: %s", q1)
return user
}
func GetAdminUserbyid(uid int) models.User {
var user models.User
q1 := `SELECT a.*,b.rolename from app_users a LEFT JOIN app_roles b ON a.roleid=b.roleid where a.userid= ` + strconv.Itoa(uid)
db.DB.Raw(q1).Find(&user)
return user
}
func UpdatUser(user models.User) {
db.DB.Table("app_users").Where("userid=?", user.Userid).Updates(&user)
if user.Tenantid != 0 {
db.DB.Table("tenants").Where("tenantid=?", user.Tenantid).Update("tenanttoken", user.Userfcmtoken)
}
}
func GetUserIDByContact(contact string, configID int) int {
var uid int
query := `SELECT userid FROM app_users WHERE contactno = ? AND configid = ?`
db.DB.Raw(query, contact, configID).Scan(&uid)
return uid
}
func GetUserIDByAuth(authname string, configID int) int {
var uid int
query := `SELECT userid FROM app_users WHERE authname = ? AND configid = ?`
db.DB.Raw(query, authname, configID).Scan(&uid)
return uid
}
func GetUserStatus(userid int) string {
var status string
db.DB.Raw("SELECT status FROM app_users WHERE userid = ?", userid).Scan(&status)
return status
}
func GetStoredPin(uid int) int {
var pin int
db.DB.Raw(`SELECT COALESCE(pin, 0) FROM app_users WHERE userid = ?`, uid).Scan(&pin)
return pin
}
func GetAuthMode(uid int) int {
var mode int
db.DB.Raw(`SELECT COALESCE(authmode, 1) FROM app_users WHERE userid = ?`, uid).Scan(&mode)
return mode
}
func UpdateUserFcmToken(uid int, token string) error {
query := `UPDATE app_users SET userfcmtoken = ? WHERE userid = ?`
return db.DB.Exec(query, token, uid).Error
}
// Check if device already exists for user
func IsDeviceLinked(userid int, deviceid string) bool {
var count int64
db.DB.Table("user_devices").
Where("userid = ? AND deviceid = ?", userid, deviceid).
Count(&count)
return count > 0
}
func GetStoredDeviceID(uid int) (string, error) {
var deviceID string
query := `SELECT deviceid FROM app_users WHERE userid = ? LIMIT 1`
result := db.DB.Raw(query, uid).Scan(&deviceID)
if result.Error != nil {
utils.Error("Error fetching deviceid", "error", result.Error)
return "", result.Error
}
// If nothing found
if result.RowsAffected == 0 {
return "", nil
}
return deviceID, nil
}
func CheckUserExists(contactno, email string, configid int) (bool, error) {
var count int64
err := db.DB.Table("app_users").
Where("configid = ?", configid).
Where(
db.DB.
Where("contactno = ? AND ? != ''", contactno, contactno).
Or("email = ? AND ? != ''", email, email),
).
Count(&count).Error
if err != nil {
return false, err
}
return count > 0, nil
}
func GetAllUsersv2(roleID, configID, tenantID, pageno, pagesize int, keyword string) []models.UserInfov2 {
var users []models.UserInfov2
var params []interface{}
var queryBuilder strings.Builder
offset := (pageno - 1) * pagesize
queryBuilder.WriteString(`
SELECT a.userid,a.authname,a.email,a.configid,a.roleid,a.authmode,a.contactno,a.firstname,
a.lastname,CONCAT(a.firstname, ' ', a.lastname) AS fullname,a.address,a.suburb,
a.city,a.state,a.postcode,a.userfcmtoken,a.pin,a.deviceid,a.devicetype,a.tenantid,
a.status,a.shiftid,
STRING_AGG(DISTINCT alc.applocationid::text, ',') AS applocationids_raw,
STRING_AGG(DISTINCT d.locationname, ',') AS applocationnames_raw,
CONCAT(c.starttime, ' - ', c.endtime) AS shiftname
FROM app_users a
LEFT JOIN app_locationconfig alc
ON alc.userid = a.userid
AND alc.configid = a.configid
AND alc.status = 'Active'
LEFT JOIN app_location d
ON d.applocationid = alc.applocationid
LEFT JOIN ridershifts c
ON a.shiftid = c.shiftid
WHERE 1=1
`)
if roleID != 0 {
queryBuilder.WriteString(" AND a.roleid = ?")
params = append(params, roleID)
}
if configID != 0 {
queryBuilder.WriteString(" AND a.configid = ?")
params = append(params, configID)
}
if tenantID != 0 {
queryBuilder.WriteString(" AND a.tenantid = ?")
params = append(params, tenantID)
}
if keyword != "" {
queryBuilder.WriteString(`
AND (
LOWER(a.firstname) LIKE ? OR
LOWER(a.contactno) LIKE ? OR
LOWER(a.suburb) LIKE ?
)
`)
search := "%" + strings.ToLower(keyword) + "%"
params = append(params, search, search, search)
}
queryBuilder.WriteString(`
GROUP BY a.userid, c.starttime, c.endtime
ORDER BY a.userid DESC
LIMIT ? OFFSET ?
`)
params = append(params, pagesize, offset)
// 🔹 Execute query
db.DB.Raw(queryBuilder.String(), params...).Scan(&users)
// 🔹 Convert RAW → API arrays
for i := range users {
// ✅ always initialize → [] not null
users[i].Applocationids = []int{}
users[i].Applocationnames = []string{}
// IDs
if users[i].ApplocationidsRaw != "" {
ids := strings.Split(users[i].ApplocationidsRaw, ",")
for _, id := range ids {
if v, err := strconv.Atoi(id); err == nil {
users[i].Applocationids = append(users[i].Applocationids, v)
}
}
}
// Names
if users[i].ApplocationnamesRaw != "" {
names := strings.Split(users[i].ApplocationnamesRaw, ",")
for _, name := range names {
users[i].Applocationnames = append(
users[i].Applocationnames,
strings.TrimSpace(name),
)
}
}
}
return users
}