BASEDIR "/src/"; LIBRARY MCMS { @version "1.1.0.0"; GENTABLEXML REPLACE; GENSCRIPT REPLACE "install" INSTALL { CREATE TABLE systemsettings; CREATE TABLE websites; CREATE TABLE websitesettings; CREATE TABLE installinfos; CREATE TABLE logs; CREATE TABLE dirurls; CREATE TABLE moduleinstances; CREATE TABLE menus; CREATE TABLE menuitems; CREATE TABLE menublocks; CREATE TABLE accounts; CREATE TABLE accountsettings; CREATE TABLE accountbinsettings; CREATE TABLE accounttextsettings; CREATE TABLE groups; CREATE TABLE groupsettings; CREATE TABLE groupbinsettings; CREATE TABLE grouptextsettings; CREATE TABLE groupmembers; CREATE TABLE accgrpaddons; CREATE TABLE aclroles; CREATE TABLE aclrolemembers; CREATE TABLE acls; CREATE TABLE sysacls; CREATE TABLE moduleinstanceacls; CREATE TABLE blocks; CREATE TABLE contents; CREATE TABLE comments; } GENSCRIPT REPLACE "update" UPDATE FROM "1.0.1.2" { IF (!TABLE dirurls EXISTS) { CREATE TABLE dirurls; } ALTER TABLE menus { ADDCOL styles; } ALTER TABLE menuitems { ADDCOL styles; ADDCOL type; ADDCOL instance; ADDCOL viewname; ADDCOL addparm1name; ADDCOL addparm1val; ADDCOL addparm2name; ADDCOL addparm2val; ADDCOL addparm3name; ADDCOL addparm3val; } ALTER TABLE menublocks { RENAMECOL class TO styles; ALTERCOL styles WITH MODEL; } IF (!TABLE accgrpaddons EXISTS) { CREATE TABLE accgrpaddons; } IF (!TABLE aclroles EXISTS) { CREATE TABLE aclroles; } IF (!TABLE aclrolemembers EXISTS) { CREATE TABLE aclrolemembers; } IF (!TABLE sysacls EXISTS) { CREATE TABLE sysacls; } ALTER TABLE acls ADDCOL role_id; ALTER TABLE acls REMOVEINDEX ids; ALTER TABLE acls SETINDEX ids account_id,group_id, role_id; ALTER TABLE accounts { ADDCOL cname; ADDCOL title; ADDCOL f_name; ADDCOL m_name; ADDCOL l_name; ADDCOL backendaccess; } } GENSCRIPT REPLACE "remove" REMOVE { DROP TABLE comments; DROP TABLE contents; DROP TABLE blocks; DROP TABLE moduleinstanceacls; DROP TABLE sysacls; DROP TABLE acls; DROP TABLE aclrolemembers; DROP TABLE aclroles; DROP TABLE accgrpaddons; DROP TABLE groupmembers; DROP TABLE grouptextsettings; DROP TABLE groupbinsettings; DROP TABLE groupsettings; DROP TABLE groups; DROP TABLE accounttextsettings; DROP TABLE accountbinsettings; DROP TABLE accountsettings; DROP TABLE accounts; DROP TABLE menublocks; DROP TABLE menuitems; DROP TABLE menus; DROP TABLE moduleinstances; DROP TABLE dirurls; DROP TABLE logs; DROP TABLE installinfos; DROP TABLE websitesettings; DROP TABLE websites; DROP TABLE systemsettings; } DEFINE LanguId AS String(16); DEFINE InstanceId AS String(64); DEFINE ValueKey AS String(64); ENUM PartType(system,plugin,module,comp); ENUM OnlineStatus(online,maintain,offline,timed); ENUM Visibility(none,user,all,acl); MODEL Model.SystemSetting { @note "Setting storage for system"; @package \MCMS\Modeling; area InstanceId; key ValueKey; value NULLABLE String(255); PKEY area,key; } MODEL Model.Website { @note "Website definitions"; @package \MCMS\Modeling; id ObjectID; parent_id NULLABLE REF Website:id DROP=REFUSE ALTER=REFUSE; domain String(255); online NULLABLE ENUM OnlineStatus; publish_start NULLABLE DateTime; publish_end NULLABLE DateTime; PKEY id; } MODEL Model.WebsiteSetting { @note "Setting storage for website and module instances"; @package \MCMS\Modeling; site_id REF Website:id DROP=CASCADE ALTER=CASCADE; instance InstanceId; key ValueKey; value NULLABLE String(255); PKEY site_id,instance,key; } DATAMODEL InstallInfo { @note "Module install info table"; @package \MCMS\Modeling; type ENUM PartType; key ValueKey; version String(10); attrib Integer; PKEY type,key; } DATAMODEL DirURL { @note "Mappings for directory urls (seo-friendly links)"; @package \MCMS\Modeling; site_id REF Website:id DROP=CASCADE ALTER=CASCADE; instance InstanceId; pnum Short; ptype Short; mapping String(64); base NULLABLE String(255) DEFAULT NULL; PKEY site_id,instance,pnum; } MODEL Model.ModuleInstance { @note "Module instance info table"; @package \MCMS\Modeling; site_id REF Website:id; base_menu_id NULLABLE Integer DEFAULT NULL; instance InstanceId; module String(128); visible NULLABLE ENUM Visibility; publish_start NULLABLE DateTime DEFAULT NULL; publish_end NULLABLE DateTime DEFAULT NULL; PKEY site_id,instance; } MODEL Model.Menu { @note "Default menu info storage"; @package \MCMS\Modeling; id ObjectID; site_id NULLABLE REF Website:id; title String(255); styles String(128) DEFAULT ''; visible NULLABLE Integer DEFAULT 7; publish_start NULLABLE DateTime DEFAULT NULL; publish_end NULLABLE DateTime DEFAULT NULL; langu NULLABLE LanguId; // language identifier langukey NULLABLE ValueKey; // common id to sync the text entries of different languages PKEY id; } MODEL Model.MenuItem { @note "Default menu item info storage"; @package \MCMS\Modeling; id ObjectID; menu_id REF Menu:id DROP=CASCADE ALTER=CASCADE; parent_id NULLABLE REF MenuItem:id; real_id Integer DEFAULT 0; title String(255); styles String(128) DEFAULT ''; visible NULLABLE Integer DEFAULT 7; publish_start NULLABLE DateTime DEFAULT NULL; publish_end NULLABLE DateTime DEFAULT NULL; langu NULLABLE LanguId; // language identifier langukey NULLABLE ValueKey; // common id to sync the text entries of different languages priority Short DEFAULT 0; target Short DEFAULT 0; type String(8) DEFAULT "self"; instance NULLABLE String(64) DEFAULT NULL; viewname NULLABLE String(64) DEFAULT NULL; addparm1name NULLABLE String(32) DEFAULT NULL; addparm1val NULLABLE String(64) DEFAULT NULL; addparm2name NULLABLE String(32) DEFAULT NULL; addparm2val NULLABLE String(64) DEFAULT NULL; addparm3name NULLABLE String(32) DEFAULT NULL; addparm3val NULLABLE String(64) DEFAULT NULL; link String(255); PKEY id; } MODEL Model.MenuBlock { @note "Default menu block info storage"; @package \MCMS\Modeling; id ObjectID; site_id NULLABLE REF Website:id; block_id String(64); menu_id NULLABLE REF Menu:id; start_level Short; end_level Short; showattr Integer DEFAULT 0; visual String(64) DEFAULT ''; styles String(128) DEFAULT ''; PKEY id; UNIQUE site_block site_id,block_id; } DATAMODEL Account { @note "Accounts"; @package \MCMS\Modeling; id ObjectID; site_id NULLABLE REF Website:id DROP=REFUSE ALTER=REFUSE; login String(160); password String(128); state Short DEFAULT 0; valid_from NULLABLE DateTime DEFAULT NULL; valid_until NULLABLE DateTime DEFAULT NULL; disabled Boolean DEFAULT FALSE; authtoken String(64); last_login NULLABLE DateTime DEFAULT NULL; last_active NULLABLE DateTime DEFAULT NULL; failed_login_count Integer DEFAULT 0; failed_login_last NULLABLE DateTime DEFAULT NULL; failed_login_lastsrc NULLABLE String(64) DEFAULT NULL; cname NULLABLE String(128) DEFAULT NULL; // common name/nickname/company/... title NULLABLE String(64) DEFAULT NULL; // common name/nickname/company/... f_name NULLABLE String(64) DEFAULT NULL; // first/given name m_name NULLABLE String(64) DEFAULT NULL; // middle/second name l_name NULLABLE String(64) DEFAULT NULL; // last/family name email String(255); seed Integer; masteradmin Boolean DEFAULT FALSE; // sysadmin, access to all areas backendaccess Boolean DEFAULT FALSE; // access, but privileges are provided by ACL table PKEY id; UNIQUE uid site_id,login; } DATAMODEL AccGrpAddon { target Short; // 0 = User, 1 = Group site_id NULLABLE REF Website:id DROP=CASCADE ALTER=CASCADE; plugin NULLABLE String(255) DEFAULT NULL; module NULLABLE String(255) DEFAULT NULL; instance NULLABLE String(64) DEFAULT NULL; key String(64); type String(64); required Boolean; valid_from NULLABLE DateTime DEFAULT NULL; valid_until NULLABLE DateTime DEFAULT NULL; langu_key String(64); defaultlabel String(255); defaultinfo String(255); } DATAMODEL AccountSetting { @note "Account setting storage"; @package \MCMS\Modeling; id REF Account:id DROP=CASCADE ALTER=CASCADE; instance InstanceId; key ValueKey; value String(255); PKEY id,instance,key; } DATAMODEL AccountTextSetting { @note "Account text setting storage (long character data)"; @package \MCMS\Modeling; id REF Account:id DROP=CASCADE ALTER=CASCADE; instance InstanceId; key ValueKey; value Text; PKEY id,instance,key; } DATAMODEL AccountBinSetting { @note "Account binary setting storage (files or other binary data)"; @package \MCMS\Modeling; id REF Account:id DROP=CASCADE ALTER=CASCADE; instance InstanceId; key ValueKey; value Blob; PKEY id,instance,key; } DATAMODEL Group { @note "User groups"; @package \MCMS\Modeling; id ObjectID; site_id NULLABLE REF Website:id DROP=REFUSE ALTER=REFUSE; name String(160); state Short DEFAULT 0; masteradmin Boolean; PKEY id; } DATAMODEL Groupmember { @note "User group members"; @package \MCMS\Modeling; group_id REF Group:id DROP=CASCADE ALTER=CASCADE; account_id REF Account:id DROP=CASCADE ALTER=CASCADE; } DATAMODEL Groupsetting { @note "Group setting storage"; @package \MCMS\Modeling; id REF Group:id DROP=CASCADE ALTER=CASCADE; instance InstanceId; key ValueKey; value String(255); PKEY id,instance,key; } DATAMODEL GroupTextSetting { @note "Group text setting storage (long character data)"; @package \MCMS\Modeling; id REF Group:id; instance InstanceId; key ValueKey; value Text; PKEY id,instance,key; } DATAMODEL GroupBinSetting { @note "Group text setting storage (files or other binary data)"; @package \MCMS\Modeling; id REF Group:id; instance InstanceId; key ValueKey; value Blob; PKEY id,instance,key; } DATAMODEL ACL { @note "Account privileges"; @package \MCMS\Modeling; account_id NULLABLE REF Account:id DROP=CASCADE ALTER=CASCADE; group_id NULLABLE REF Group:id DROP=CASCADE ALTER=CASCADE; role_id NULLABLE REF ACLRole:id DROP=CASCADE ALTER=CASCADE; site_id NULLABLE REF Website:id DROP=REFUSE ALTER=REFUSE; instance NULLABLE InstanceId; key ValueKey; value Short DEFAULT 0; INDEX ids account_id,group_id, role_id; } DATAMODEL SysACL { @note "Backend privileges"; @package \MCMS\Modeling; account_id NULLABLE REF Account:id DROP=CASCADE ALTER=CASCADE; group_id NULLABLE REF Group:id DROP=CASCADE ALTER=CASCADE; role_id NULLABLE REF ACLRole:id DROP=CASCADE ALTER=CASCADE; site_id NULLABLE REF Website:id DROP=REFUSE ALTER=REFUSE; area String(128); instance NULLABLE String(128) DEFAULT NULL; key ValueKey; value Short DEFAULT 0; INDEX ids account_id,group_id, role_id; } DATAMODEL ACLRole { id ObjectID; site_id NULLABLE REF Website:id DROP=REFUSE ALTER=REFUSE; name String(255); PKEY id; } DATAMODEL ACLRoleMember { role_id NULLABLE REF ACLRole:id DROP=CASCADE ALTER=CASCADE; account_id NULLABLE REF Account:id DROP=CASCADE ALTER=CASCADE; group_id NULLABLE REF Group:id DROP=CASCADE ALTER=CASCADE; } MODEL Model.ModuleInstanceACL { @package \MCMS\Modeling; account_id NULLABLE REF Account:id DROP=CASCADE ALTER=CASCADE; group_id NULLABLE REF Group:id DROP=CASCADE ALTER=CASCADE; site_id NULLABLE REF Website:id DROP=REFUSE ALTER=REFUSE; instance NULLABLE InstanceId; publish_start NULLABLE DateTime; publish_end NULLABLE DateTime; INDEX site_instance site_id,instance; } MODEL Model.Block { @note "Module instance access table"; @package \MCMS\Modeling; site_id REF Website:id DROP=REFUSE ALTER=CASCADE; name String(32); plugin String(128); publish_start NULLABLE DateTime; publish_end NULLABLE DateTime; PKEY site_id,name; } DATAMODEL Log { @note "Universal log entries"; @package \MCMS\Modeling; id LongSerial; parent NULLABLE Long; eventtime DateTime DEFAULT NOW; site_id NULLABLE Integer; level Short; area String(20); areaname NULLABLE String(64); user NULLABLE String(128); code NULLABLE Integer; readed Boolean DEFAULT FALSE; message String(255); PKEY id; INDEX event eventtime,site_id,level; INDEX readed readed; } MODEL Model.Content { @note "Universal content entries"; @package \MCMS\Modeling; id ObjectID; // unique id site_id NULLABLE REF Website:id DROP=REFUSE ALTER=REFUSE; instance InstanceId; // module instance key NULLABLE ValueKey; // key langu NULLABLE LanguId; // language identifier langukey NULLABLE ValueKey; // common id to sync the text entries of different languages state Integer; title String(255); descr String(255); content HTML; publish_start NULLABLE DateTime; publish_end NULLABLE DateTime; revision Integer DEFAULT 0; read_count Integer DEFAULT 0; created_by_id NULLABLE UserID DEFAULT NULL; created_by_name NULLABLE String(64) DEFAULT NULL; created_at NULLABLE DateTime DEFAULT NULL; modified_by_id NULLABLE UserID DEFAULT NULL; modified_by_name NULLABLE String(64) DEFAULT NULL; modified_at NULLABLE DateTime DEFAULT NULL; deleted_by_id NULLABLE UserID DEFAULT NULL; deleted_by_name NULLABLE String(64) DEFAULT NULL; deleted_at NULLABLE DateTime DEFAULT NULL; PKEY id; INDEX site_instance site_id,instance,key; } MODEL Model.Comment { @note "Universal comment entries"; @package \MCMS\Modeling; id ObjectID; // unique id site_id NULLABLE REF Website:id DROP=REFUSE ALTER=REFUSE; instance InstanceId; // module instance key NULLABLE ValueKey; // key state Short DEFAULT 0; parent_id NULLABLE Integer; parent_key NULLABLE ValueKey; parent_comment NULLABLE REF Comment:id; // comment on comments langu NULLABLE LanguId; // language identifier langukey NULLABLE ValueKey; // common id to sync the text entries of different languages revision Integer DEFAULT 0; read_count Integer DEFAULT 0; title String(255) DEFAULT ''; content Text; created_by_id NULLABLE UserID DEFAULT NULL; created_by_name NULLABLE String(64) DEFAULT NULL; created_at NULLABLE DateTime DEFAULT NULL; modified_by_id NULLABLE UserID DEFAULT NULL; modified_by_name NULLABLE String(64) DEFAULT NULL; modified_at NULLABLE DateTime DEFAULT NULL; deleted_by_id NULLABLE UserID DEFAULT NULL; deleted_by_name NULLABLE String(64) DEFAULT NULL; deleted_at NULLABLE DateTime DEFAULT NULL; PKEY id; INDEX site_instance site_id,instance,key; } // ABSTRACT ~MODEL User.UserBase IMPLEMENTS MCMS.User.iUser { // id Integer; // login String(255); // password Password(255); // email EMail; // site_id Integer; // timezone NULLABLE String(16) DEFAULT NULL; // locale NULLABLE String(16) DEFAULT NULL; // last_login NULLABLE DateTime DEFAULT NULL; // last_active NULLABLE DateTime DEFAULT NULL; // failed_login_count NULLABLE Integer DEFAULT NULL; // failed_login_last NULLABLE DateTime DEFAULT NULL; // failed_login_lastsrc NULLABLE String(48) DEFAULT NULL; // masteradmin Boolean; // // METHOD getId=id; // // METHOD getSiteId=NULL; // // METHOD getLogin=ATTRSTRING("login"); // METHOD getPassword=ATTRSTRING("password"); // METHOD setMasterAdmin($value) { // $this->masteradmin = (boolean) $value; // } // METHOD isMasterAdmin() { // return (boolean) $this->masteradmin; // } // METHOD isAuthenticated() { // return $this->id > 0; // } // METHOD __toString=ATTRSTRING("login"); // } SERVICE Service.ACL { } SERVICE Service.Content { METHOD storeContent(Content c) STORES c:id IN "contents"; METHOD getContent(Integer id) GETS id=id AS Content FROM "contents"; METHOD removeInstance(Content c) REMOVES c(id=id) FROM "contents"; } SERVICE Service.Instance { METHOD getSiteInstances(Integer siteId, String orderBy) GETALL site_id=siteId AS ModuleInstance ORDERBY orderBy FROM "moduleinstances"; // METHOD storeInstance(ModuleInstance instance) STORES instance:id IN "moduleinstances"; METHOD getInstance(Integer siteId, String name) GETS site_id=siteId,instance=name AS ModuleInstance FROM "moduleinstances"; // METHOD dropInstance(ModuleInstance instance) REMOVES instance(id=id) FROM "moduleinstances"; } SERVICE Service.Module { } SERVICE Service.Plugin { } SERVICE Service.Site { } } PLUGIN AUTH MCMS.DefaultAuth { @version "1.1.0.0"; } PLUGIN AUTH MCMS.ADSAuth { @version "1.1.0.0"; } PLUGIN AUTH MCMS.LDAPAuth { @version "1.1.0.0"; } PLUGIN CONTENT MCMS.AdminContent { @version "1.1.0.0"; } PLUGIN CONTENT MCMS.AdminMenu { @version "1.1.0.0"; // SERVICE Menu { // // } } PLUGIN CONTENT MCMS.MainContent { @version "1.1.0.0"; } PLUGIN CONTENT MCMS.MainMenu { @version "1.1.0.0"; SERVICE Menu { METHOD getMenuInfo(Integer id) GETS id=id AS #LIBRARY:MCMS.Menu FROM "menus"; METHOD getMenuItem(Integer id) GETS id=id AS #LIBRARY:MCMS.MenuItem FROM "menuitems"; } } PLUGIN CONTENT MCMS.NavbarMenu EXTENDS MCMS.MainMenu { @version "1.1.0.0"; }