rooms.go (4210B)
1 // Copyright © 2018 MTRNord <info@nordgedanken.de> 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package sqlite 16 17 import ( 18 "encoding/json" 19 "github.com/Nordgedanken/Morpheusv2/pkg/matrix" 20 "github.com/Nordgedanken/Morpheusv2/pkg/matrix/rooms" 21 ) 22 23 // SaveRoom saves a Room into the sqlite DB 24 func (s *SQLite) SaveRoom(Room matrix.Room) error { 25 if s.db == nil { 26 s.db = s.Open() 27 } 28 29 tx, err := s.db.Begin() 30 if err != nil { 31 return err 32 } 33 34 stmt, err := tx.Prepare("INSERT INTO rooms (room_aliases, id, room_name, room_avatar, room_topic, room_messages) VALUES (?, ?, ?, ?, ?, ?)") 35 if err != nil { 36 return err 37 } 38 defer stmt.Close() 39 40 aliases := Room.GetRoomAliases() 41 aliasesBytes, err := json.Marshal(aliases) 42 if err != nil { 43 return err 44 } 45 aliasesS := string(aliasesBytes) 46 roomID := Room.GetRoomID() 47 name, err := Room.GetName() 48 if err != nil { 49 return err 50 } 51 avatar, err := Room.GetAvatar() 52 if err != nil { 53 return err 54 } 55 topic, err := Room.GetTopic() 56 if err != nil { 57 return err 58 } 59 60 messages := Room.GetMessages() 61 if err != nil { 62 return err 63 } 64 var messageIDs []string 65 for _, v := range messages { 66 messageIDs = append(messageIDs, v.GetEventID()) 67 } 68 69 _, err = stmt.Exec(aliasesS, roomID, name, string(avatar), topic, messageIDs) 70 if err != nil { 71 return err 72 } 73 return tx.Commit() 74 } 75 76 // GetRooms returns all Rooms from the Database 77 func (s *SQLite) GetRooms() (roomsR []matrix.Room, err error) { 78 if s.db == nil { 79 s.db = s.Open() 80 } 81 82 rows, err := s.db.Query("SELECT id, room_aliases, room_name, room_avatar, room_topic, room_messages FROM rooms") 83 if err != nil { 84 return 85 } 86 defer rows.Close() 87 88 for rows.Next() { 89 var roomID string 90 var roomAliases string 91 var roomName string 92 var roomAvatar string 93 var roomTopic string 94 var roomMessages string 95 err = rows.Scan(&roomID, &roomAliases, &roomName, &roomAvatar, &roomTopic, &roomMessages) 96 if err != nil { 97 return 98 } 99 100 roomI := &rooms.Room{} 101 roomI.SetRoomID(roomID) 102 var aliases []string 103 err = json.Unmarshal([]byte(roomAliases), &aliases) 104 if err != nil { 105 return 106 } 107 roomI.SetRoomAliases(aliases) 108 roomI.SetName(roomName) 109 roomI.SetAvatar([]byte(roomAvatar)) 110 roomI.SetTopic(roomTopic) 111 var messageIDs []string 112 err = json.Unmarshal([]byte(roomMessages), &messageIDs) 113 if err != nil { 114 return 115 } 116 // TODO Convert IDs to messages slice using another call or from the beginning on using a JOIN 117 //roomI.SetMessages(messages) 118 119 roomsR = append(roomsR, roomI) 120 } 121 122 // get any error encountered during iteration 123 err = rows.Err() 124 return 125 } 126 127 // GetRoom returns the Room where the id matches the roomID 128 func (s *SQLite) GetRoom(roomID string) (roomR matrix.Room, err error) { 129 if s.db == nil { 130 s.db = s.Open() 131 } 132 133 stmt, err := s.db.Prepare(`SELECT room_aliases, room_name, room_avatar, room_topic, room_messages FROM rooms WHERE id=$1`) 134 if err != nil { 135 return 136 } 137 defer stmt.Close() 138 139 row := stmt.QueryRow(roomID) 140 141 var roomAliases string 142 var roomName string 143 var roomAvatar string 144 var roomTopic string 145 var roomMessages string 146 err = row.Scan(&roomAliases, &roomName, &roomAvatar, &roomTopic, &roomMessages) 147 if err != nil { 148 return 149 } 150 151 roomI := &rooms.Room{} 152 roomI.SetRoomID(roomID) 153 var aliases []string 154 err = json.Unmarshal([]byte(roomAliases), &aliases) 155 if err != nil { 156 return 157 } 158 roomI.SetRoomAliases(aliases) 159 roomI.SetName(roomName) 160 roomI.SetAvatar([]byte(roomAvatar)) 161 roomI.SetTopic(roomTopic) 162 var messageIDs []string 163 err = json.Unmarshal([]byte(roomMessages), &messageIDs) 164 if err != nil { 165 return 166 } 167 // TODO Convert IDs to messages slice using another call or from the beginning on using a JOIN 168 //roomI.SetMessages(messages) 169 170 roomR = roomI 171 return 172 }