2018-02-27 14:16:23 +00:00
// Copyright 2018 Documize Inc. <legal@documize.com>. All rights reserved.
//
// This software (Documize Community Edition) is licensed under
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
//
// You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>.
//
// https://documize.com
package mysql
import (
"database/sql"
"fmt"
"time"
"github.com/documize/community/core/env"
"github.com/documize/community/domain"
"github.com/documize/community/domain/store/mysql"
"github.com/documize/community/model/group"
"github.com/pkg/errors"
)
// Scope provides data access to MySQL.
type Scope struct {
Runtime * env . Runtime
}
// Add inserts new user group into store.
func ( s Scope ) Add ( ctx domain . RequestContext , g group . Group ) ( err error ) {
g . Created = time . Now ( ) . UTC ( )
g . Revised = time . Now ( ) . UTC ( )
2018-09-18 20:55:40 +01:00
_ , err = ctx . Transaction . Exec ( "INSERT INTO dmz_group (c_refid, c_orgid, c_name, c_desc, c_created, c_revised) VALUES (?, ?, ?, ?, ?, ?)" ,
2018-02-27 14:16:23 +00:00
g . RefID , g . OrgID , g . Name , g . Purpose , g . Created , g . Revised )
if err != nil {
err = errors . Wrap ( err , "insert group" )
}
return
}
// Get returns requested group.
func ( s Scope ) Get ( ctx domain . RequestContext , refID string ) ( g group . Group , err error ) {
2018-09-18 20:55:40 +01:00
err = s . Runtime . Db . Get ( & g , `
2018-09-20 12:47:47 +01:00
SELECT id , c_refid AS refid , c_orgid AS orgid , c_name AS name , c_desc AS purpose , c_created AS created , c_revised AS revised
2018-09-18 20:55:40 +01:00
FROM dmz_group
WHERE c_orgid = ? AND c_refid = ? ` ,
2018-02-27 14:16:23 +00:00
ctx . OrgID , refID )
if err != nil {
err = errors . Wrap ( err , "select group" )
}
return
}
// GetAll returns all user groups for current orgID.
func ( s Scope ) GetAll ( ctx domain . RequestContext ) ( groups [ ] group . Group , err error ) {
2018-04-05 14:25:36 +01:00
groups = [ ] group . Group { }
2018-09-18 20:55:40 +01:00
err = s . Runtime . Db . Select ( & groups , `
2018-09-20 12:47:47 +01:00
SELECT a . id , a . c_refid AS refid , a . c_orgid AS orgid , a . c_name AS name , a . c_desc AS purpose , a . c_created AS created , a . c_revised AS revised ,
COUNT ( b . c_groupid ) AS members
2018-09-18 20:55:40 +01:00
FROM dmz_group a
LEFT JOIN dmz_group_member b ON a . c_refid = b . c_groupid
WHERE a . c_orgid = ?
2018-09-19 16:03:29 +01:00
GROUP BY a . id , a . c_refid , a . c_orgid , a . c_name , a . c_desc , a . c_created , a . c_revised
2018-09-18 20:55:40 +01:00
ORDER BY a . c_name ` ,
2018-02-27 14:16:23 +00:00
ctx . OrgID )
2018-04-05 14:25:36 +01:00
if err == sql . ErrNoRows {
2018-02-27 14:16:23 +00:00
err = nil
}
if err != nil {
err = errors . Wrap ( err , "select groups" )
}
return
}
// Update group name and description.
func ( s Scope ) Update ( ctx domain . RequestContext , g group . Group ) ( err error ) {
g . Revised = time . Now ( ) . UTC ( )
2018-09-18 20:55:40 +01:00
_ , err = ctx . Transaction . Exec ( ` UPDATE dmz_group SET
c_name = ? , c_desc = ? , c_revised = ?
WHERE c_orgid = ? AND c_refid = ? ` ,
2018-02-27 14:16:23 +00:00
g . Name , g . Purpose , g . Revised , ctx . OrgID , g . RefID )
if err != nil {
err = errors . Wrap ( err , "update group" )
}
return
}
// Delete removes group from store.
func ( s Scope ) Delete ( ctx domain . RequestContext , refID string ) ( rows int64 , err error ) {
b := mysql . BaseQuery { }
2018-09-20 12:47:47 +01:00
_ , err = b . DeleteConstrained ( ctx . Transaction , "dmz_group" , ctx . OrgID , refID )
if err != nil {
return
}
2018-09-18 20:55:40 +01:00
return b . DeleteWhere ( ctx . Transaction , fmt . Sprintf ( "DELETE FROM dmz_group_member WHERE c_orgid=\"%s\" AND c_groupid=\"%s\"" , ctx . OrgID , refID ) )
2018-02-27 14:16:23 +00:00
}
2018-02-28 14:55:36 +00:00
// GetGroupMembers returns all user associated with given group.
func ( s Scope ) GetGroupMembers ( ctx domain . RequestContext , groupID string ) ( members [ ] group . Member , err error ) {
2018-04-05 14:25:36 +01:00
members = [ ] group . Member { }
2018-09-18 20:55:40 +01:00
err = s . Runtime . Db . Select ( & members , `
SELECT a . id , a . c_orgid AS orgid , a . c_groupid AS groupid , a . c_userid AS userid ,
IFNULL ( b . c_firstname , ' ' ) as firstname , IFNULL ( b . c_lastname , ' ' ) as lastname
FROM dmz_group_member a
LEFT JOIN dmz_user b ON b . c_refid = a . c_userid
WHERE a . c_orgid = ? AND a . c_groupid = ?
ORDER BY b . c_firstname , b . c_lastname ` ,
2018-02-28 14:55:36 +00:00
ctx . OrgID , groupID )
2018-04-05 14:25:36 +01:00
if err == sql . ErrNoRows {
2018-02-28 14:55:36 +00:00
err = nil
}
if err != nil {
err = errors . Wrap ( err , "select members" )
}
return
}
2018-02-28 15:39:46 +00:00
// JoinGroup adds user to group.
func ( s Scope ) JoinGroup ( ctx domain . RequestContext , groupID , userID string ) ( err error ) {
2018-09-20 12:47:47 +01:00
_ , err = ctx . Transaction . Exec ( "INSERT INTO dmz_group_member (c_orgid, c_groupid, c_userid) VALUES (?, ?, ?)" , ctx . OrgID , groupID , userID )
2018-02-28 15:39:46 +00:00
if err != nil {
err = errors . Wrap ( err , "insert group member" )
}
return
}
// LeaveGroup removes user from group.
func ( s Scope ) LeaveGroup ( ctx domain . RequestContext , groupID , userID string ) ( err error ) {
b := mysql . BaseQuery { }
2018-09-18 20:55:40 +01:00
_ , err = b . DeleteWhere ( ctx . Transaction , fmt . Sprintf ( "DELETE FROM dmz_group_member WHERE c_orgid=\"%s\" AND c_groupid=\"%s\" AND c_userid=\"%s\"" , ctx . OrgID , groupID , userID ) )
2018-02-28 15:39:46 +00:00
if err != nil {
err = errors . Wrap ( err , "clear group member" )
}
return
}
2018-03-01 19:14:27 +00:00
// GetMembers returns members for every group.
// Useful when you need to bulk fetch membership records
// for subsequent processing.
func ( s Scope ) GetMembers ( ctx domain . RequestContext ) ( r [ ] group . Record , err error ) {
2018-04-05 14:25:36 +01:00
r = [ ] group . Record { }
2018-09-18 20:55:40 +01:00
err = s . Runtime . Db . Select ( & r , `
SELECT a . id , a . c_orgid AS orgid , a . c_groupid AS groupid , a . c_userid AS userid ,
b . c_name As name , b . c_desc AS purpose
FROM dmz_group_member a , dmz_group b
2018-09-20 11:12:17 +01:00
WHERE a . c_orgid = ? AND a . c_groupid = b . c_refid
2018-09-18 20:55:40 +01:00
ORDER BY a . c_userid ` ,
2018-03-01 19:14:27 +00:00
ctx . OrgID )
2018-04-05 14:25:36 +01:00
if err == sql . ErrNoRows {
2018-03-01 19:14:27 +00:00
err = nil
}
if err != nil {
err = errors . Wrap ( err , "select group members" )
}
return
}