BASEDIR "/src/"; MODULEX MCMS.BBoard EXTENDS Mod.Base.Base { @version "1.0.0"; GENTABLEXML REPLACE; GENSCRIPT REPLACE "install" INSTALL { CREATE TABLE categorys; CREATE TABLE boards; CREATE TABLE boardacls; CREATE TABLE topics; CREATE TABLE topicpolls; CREATE TABLE topicpolloptions; CREATE TABLE topicpollvotes; CREATE TABLE posts; CREATE TABLE postvotes; CREATE TABLE postmedias; } GENSCRIPT REPLACE "remove" REMOVE { DROP TABLE postmedias; DROP TABLE postvotes; DROP TABLE posts; DROP TABLE topicpollvotes; DROP TABLE topicpolloptions; DROP TABLE topicpolls; DROP TABLE topics; DROP TABLE boardacls; DROP TABLE boards; DROP TABLE categorys; } ENUM Access (none, read, rw); ENUM AdminState (mod,admin); ENUM TopicState (open, closed, hidden); MODEL Category { id ObjectID; site_id NULLABLE Integer; instance String(64); name String(128); acc_public ENUM Access; acc_user ENUM Access; ~boards []Object; PKEY id; INDEX site_id site_id; } MODEL Board { id ObjectID; category_id NULLABLE REF Category:id DROP=NULL ALTER=CASCADE; site_id NULLABLE Integer; instance String(64); acc_public ENUM Access; acc_user ENUM Access; name String(128); desc String(255); postVoting Boolean; postAttachments Boolean; ~topicCount Integer; ~postCount Integer; PKEY id; INDEX category_id category_id; } DATAMODEL BoardACL { board REF Board:id DROP=CASCADE ALTER=CASCADE; state ENUM AdminState; user NULLABLE UserID; group NULLABLE GroupID; INDEX board board; } MODEL Topic { id ObjectID; board_id REF Board:id DROP=CASCADE ALTER=CASCADE; state ENUM TopicState; title String(255); desc String(255); created_by_id NULLABLE UserID; created_by_name String(128); created_at DateTime DEFAULT NOW; update_count Integer; last_updated_at NULLABLE DateTime; last_updated_by_id UserID; readcount Integer DEFAULT 0; ~answers Integer; PKEY id; INDEX board_id board_id; } MODEL TopicPoll EXTENDS Topic { poll_title String(255); poll_question Text; poll_closed Boolean; poll_till NULLABLE DateTime DEFAULT NULL; allowed_votes Integer DEFAULT 1; show_voters Boolean; } MODEL TopicPollOption { id ObjectID; topic_id REF Topic:id DROP=CASCADE ALTER=CASCADE; name String(255); PKEY id; INDEX topic_id topic_id; } DATAMODEL TopicPollVote { option_id REF TopicPollOption:id DROP=CASCADE ALTER=CASCADE; user_id UserID; votedate DateTime DEFAULT NOW; PKEY option_id,user_id; } MODEL Post { id ObjectID; topic_id REF Topic:id DROP=CASCADE ALTER=CASCADE; created_by_id NULLABLE UserID; created_by_name String(128); created_at DateTime DEFAULT NOW; update_count Integer; last_updated_at NULLABLE DateTime; last_updated_by_id UserID; post Text; PKEY id; INDEX topic_info topic_id,created_at; } DATAMODEL PostVote { post_id REF Post:id DROP=CASCADE ALTER=CASCADE; user_id UserID; votedate DateTime DEFAULT NOW; value Short; PKEY post_id,user_id; } MODEL PostMedia { id ObjectID; post_id REF Post:id DROP=CASCADE ALTER=CASCADE; name String(255); public Boolean; PKEY id; INDEX post_id post_id; } DATAMODEL PostMediaData { id REF PostMedia:id DROP=CASCADE ALTER=CASCADE; data Blob; } SERVICE Data { METHOD getAllCategories(Integer siteId); METHOD getBoard(Integer siteId, String instance, Integer id) GETS site_id=siteId,instance=instance,id=id AS Board FROM "m_mcms#bboard_boards"; METHOD getTopic(Integer id) GETS id=id AS Topic FROM "m_mcms#bboard_topics"; METHOD getPost(Integer id) GETS id=id AS Post FROM "m_mcms#bboard_posts"; METHOD getTopicPost(Integer topic_id, Integer id) GETS id=id, topic_id=topic_id AS Post FROM "m_mcms#bboard_posts"; } SERVICE Setting { } view index { LIST Category categories>cat { SHOW Category cat; LIST Board boards>board { SHOW Board board; } } } view organize { CHECKPERM manage; } view board { LIST Topic topics>topic { SHOW Topic topic; } } view boardEdit { CHECKPERM manage; SHOW FORM FIELDS Board board IGNORE id, site_id, instance, postVoting, postAttachments, topicCount, postCount; } view boardACL { CHECKPERM manage; } view topic { SHOW Topic topic; LIST Post posts>post { SHOW Post post; } } view topicNew NOTEMPLATE { } view topicEdit { SHOW FORM Topic topic; SHOW FORM Post post; } view postNew NOTEMPLATE { } view postEdit NOTEMPLATE { } }