morpheusv2

A Matrix client written in Go-QT
git clone git://archive.git.mtrnord.blog/Nordgedanken/morpheusv2.git
Log | Files | Refs | README | LICENSE

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 }