2017-07-24 16:24:21 +01:00
// Copyright 2016 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
2017-07-26 10:50:26 +01:00
// Package mysql handles data persistence for spaces.
package mysql
2017-07-24 16:24:21 +01:00
import (
2017-10-09 10:56:59 -04:00
"database/sql"
2017-07-24 16:24:21 +01:00
"fmt"
"time"
2017-07-26 10:50:26 +01:00
"github.com/documize/community/core/env"
2017-07-24 16:24:21 +01:00
"github.com/documize/community/domain"
"github.com/documize/community/domain/store/mysql"
2017-07-26 10:50:26 +01:00
"github.com/documize/community/model/space"
2017-07-24 16:24:21 +01:00
"github.com/pkg/errors"
)
2017-07-26 10:50:26 +01:00
// Scope provides data access to MySQL.
type Scope struct {
Runtime * env . Runtime
}
2017-07-24 16:24:21 +01:00
// Add adds new folder into the store.
2017-07-26 10:50:26 +01:00
func ( s Scope ) Add ( ctx domain . RequestContext , sp space . Space ) ( err error ) {
sp . UserID = ctx . UserID
2017-07-24 16:24:21 +01:00
sp . Created = time . Now ( ) . UTC ( )
sp . Revised = time . Now ( ) . UTC ( )
2018-09-18 20:55:40 +01:00
_ , err = ctx . Transaction . Exec ( "INSERT INTO dmz_space (c_refid, c_name, c_orgid, c_userid, c_type, c_lifecycle, c_likes, c_created, c_revised) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)" ,
2018-04-20 14:38:35 +01:00
sp . RefID , sp . Name , sp . OrgID , sp . UserID , sp . Type , sp . Lifecycle , sp . Likes , sp . Created , sp . Revised )
2017-07-24 16:24:21 +01:00
if err != nil {
err = errors . Wrap ( err , "unable to execute insert for label" )
}
return
}
// Get returns a space from the store.
2017-07-26 10:50:26 +01:00
func ( s Scope ) Get ( ctx domain . RequestContext , id string ) ( sp space . Space , err error ) {
2018-09-18 20:55:40 +01:00
err = s . Runtime . Db . Get ( & sp , ` SELECT id , c_refid as refid ,
c_name as name , c_orgid as orgid , c_userid as userid ,
c_type as type , c_lifecycle as lifecycle , c_likes as likes ,
c_created as created , c_revised as revised
FROM dmz_space
WHERE c_orgid = ? and c_refid = ? ` ,
2017-09-25 14:37:11 +01:00
ctx . OrgID , id )
2017-07-24 16:24:21 +01:00
if err != nil {
err = errors . Wrap ( err , fmt . Sprintf ( "unable to execute select for label %s" , id ) )
}
return
}
2017-08-07 14:42:02 +01:00
// PublicSpaces returns spaces that anyone can see.
2017-07-26 10:50:26 +01:00
func ( s Scope ) PublicSpaces ( ctx domain . RequestContext , orgID string ) ( sp [ ] space . Space , err error ) {
2018-09-18 20:55:40 +01:00
qry := ` SELECT id , c_refid as refid
c_name as name , c_orgid as orgid , c_userid as userid ,
c_type as type , c_lifecycle as lifecycle , c_likes as likes ,
c_created as created , c_revised as revised
FROM dmz_space
WHERE c_orgid = ? AND c_type = 1 `
2017-07-24 16:24:21 +01:00
2018-03-23 11:52:19 +00:00
err = s . Runtime . Db . Select ( & sp , qry , orgID )
2017-07-24 16:24:21 +01:00
2018-03-23 11:52:19 +00:00
if err == sql . ErrNoRows {
err = nil
sp = [ ] space . Space { }
}
2017-07-24 16:24:21 +01:00
if err != nil {
err = errors . Wrap ( err , fmt . Sprintf ( "Unable to execute GetPublicFolders for org %s" , orgID ) )
}
return
}
2017-09-26 20:13:44 +01:00
// GetViewable returns spaces that the user can see.
2017-08-07 14:42:02 +01:00
// Also handles which spaces can be seen by anonymous users.
2017-09-26 20:13:44 +01:00
func ( s Scope ) GetViewable ( ctx domain . RequestContext ) ( sp [ ] space . Space , err error ) {
2017-10-09 10:56:59 -04:00
q := `
2018-09-18 20:55:40 +01:00
SELECT id , c_refid as refid
c_name as name , c_orgid as orgid , c_userid as userid ,
c_type as type , c_lifecycle as lifecycle , c_likes as likes ,
c_created as created , c_revised as revised
FROM dmz_space
WHERE c_orgid = ? AND c_refid IN
( SELECT c_refid FROM dmz_permission WHERE c_orgid = ? AND c_location = ' space ' AND c_refid IN
( SELECT c_refid FROM dmz_permission WHERE c_orgid = ? AND c_who = ' user ' AND ( c_whoid = ? OR c_whoid = '0' ) AND c_location = ' space ' AND c_action = ' view '
UNION ALL
SELECT p . refid from dmz_permission p LEFT JOIN dmz_group_member r ON p . c_whoid = r . c_groupid WHERE p . c_orgid = ? AND p . c_who = ' role '
AND p . c_location = ' space ' AND p . c_action = ' view ' AND ( r . c_userid = ? OR r . c_userid = '0' )
)
)
ORDER BY c_name `
2017-07-24 16:24:21 +01:00
2017-10-09 10:56:59 -04:00
err = s . Runtime . Db . Select ( & sp , q ,
2017-07-26 10:50:26 +01:00
ctx . OrgID ,
ctx . OrgID ,
ctx . OrgID ,
2017-09-15 11:08:05 +01:00
ctx . UserID ,
2017-07-26 10:50:26 +01:00
ctx . OrgID ,
ctx . UserID )
2017-07-24 16:24:21 +01:00
2017-10-09 10:56:59 -04:00
if err == sql . ErrNoRows {
err = nil
sp = [ ] space . Space { }
}
2017-09-26 20:13:44 +01:00
if err != nil {
err = errors . Wrap ( err , fmt . Sprintf ( "failed space.GetViewable org %s" , ctx . OrgID ) )
}
return
}
// GetAll for admin users!
func ( s Scope ) GetAll ( ctx domain . RequestContext ) ( sp [ ] space . Space , err error ) {
2018-03-23 11:52:19 +00:00
qry := `
2018-09-18 20:55:40 +01:00
SELECT id , c_refid as refid
c_name as name , c_orgid as orgid , c_userid as userid ,
c_type as type , c_lifecycle as lifecycle , c_likes as likes ,
c_created as created , c_revised as revised
FROM dmz_space
WHERE c_orgid = ?
ORDER BY c_name `
2017-09-26 20:13:44 +01:00
2018-03-23 11:52:19 +00:00
err = s . Runtime . Db . Select ( & sp , qry , ctx . OrgID )
2017-09-26 20:13:44 +01:00
2018-03-23 11:52:19 +00:00
if err == sql . ErrNoRows {
err = nil
sp = [ ] space . Space { }
}
2017-07-24 16:24:21 +01:00
if err != nil {
2017-09-15 11:08:05 +01:00
err = errors . Wrap ( err , fmt . Sprintf ( "failed space.GetAll org %s" , ctx . OrgID ) )
2017-07-24 16:24:21 +01:00
}
return
}
// Update saves space changes.
2017-07-26 10:50:26 +01:00
func ( s Scope ) Update ( ctx domain . RequestContext , sp space . Space ) ( err error ) {
2017-07-24 16:24:21 +01:00
sp . Revised = time . Now ( ) . UTC ( )
2018-09-18 20:55:40 +01:00
_ , err = ctx . Transaction . NamedExec ( "UPDATE dmz_space SET c_name=:name, c_type=:type, c_lifecycle=:lifecycle, c_userid=:userid, c_likes=:likes, c_revised=:revised WHERE c_orgid=:orgid AND c_refid=:refid" , & sp )
2017-07-24 16:24:21 +01:00
if err != nil {
err = errors . Wrap ( err , fmt . Sprintf ( "unable to execute update for label %s" , sp . RefID ) )
}
return
}
// Delete removes space from the store.
2017-07-26 10:50:26 +01:00
func ( s Scope ) Delete ( ctx domain . RequestContext , id string ) ( rows int64 , err error ) {
2017-07-24 16:24:21 +01:00
b := mysql . BaseQuery { }
2018-09-18 20:55:40 +01:00
return b . DeleteConstrained ( ctx . Transaction , "dmz_space" , ctx . OrgID , id )
2017-07-24 16:24:21 +01:00
}