github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/design/slack-ts/slack.ts (about) 1 /***************************************** 2 3 Slack workspace 4 5 */ 6 7 workspace Organization{ // CDoc<Organization>, Workspace descirptor 8 collections: [Channels] 9 } 10 11 collection Channels { 12 channel: ref(Channel) 13 } 14 15 /****************************************** 16 17 Channel workspace 18 19 */ 20 21 tag slack("all about slack") 22 23 tag message("all about message") 24 25 workspace Channel{ 26 parent: ref(Organization) 27 collections: [MessageReaction, ChannelMessage, ThreadMessage] 28 } 29 30 struct Message { 31 text: string 32 typed: TimeStampMs 33 } 34 35 collection MessageReaction { 36 message: ref (ChannelMessage | ThreadMessage) 37 kind: ReactionKind 38 time: TimeStampMs 39 unique(Message, sys.Creator, Kind) 40 tag(slack, message, something) 41 sort() 42 } 43 44 collection ChannelMessage { 45 message: Message 46 tag(slack, message, something) 47 } 48 49 collection ThreadMessage { 50 message: Message 51 chanel_message: ref(ChannelMessage) 52 } 53 54 view ChannelMessageView (ChannelMessage) { 55 text: message.Text 56 message_date_time: sys.created 57 author: sys.creator.Name 58 reactions: select Kind, count from MessageReaction group by Kind 59 top_reactors: select last 10 user, insertDatetime from MessageReaction 60 } 61 62 It is possible to enrich results using references (e.g. ref. to ChannelMessage is known) (some query language is needed) 63 64 Collection ops: 65 - Read first/last n 66 - Neighborhood of given ID 67 - Entire collection/workspace (indexing/import) 68 69 Key structure: ((id_hi, id_lo), idx) 70 Value structure: 71 - record_data 72 - next_id_hi // valid for idx=20 (bucket size) 73 - next_id_lo // valid for idx=20 (bucket size) 74 75 qname is not needed :) 76