BASEDIR "/src/"; MODULEX MCMS.BBoard EXTENDS Base { VERSION "1.0.0"; GENTABLEXML REPLACE; 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 UserID; group 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; PKEY id; INDEX board_id board_id; } MODEL TopicPoll { id ObjectID; topic_id REF Topic:id DROP=CASCADE ALTER=CASCADE; title String(255); question Text; votes Integer; pollclosed Boolean; showvoters Boolean; PKEY id; INDEX topic_id topic_id; } 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"; } view index { LIST Category categories:cat { SHOW Category cat; LIST Board boards:board { SHOW Board board; } } } view organize { } view board { LIST Topic topics:topic { SHOW Topic topic; } } view boardACL { } view topic { SHOW Topic topic; LIST Post posts:post { SHOW Post post; } } view newTopic NOTEMPLATE { } view editTopic { FORM Topic topic; FORM Post post; } view newPost NOTEMPLATE { } view editPost NOTEMPLATE { } }