2020-01-02 09:21:11 +01:00
|
|
|
|
2020-01-29 15:56:49 +01:00
|
|
|
require "dodb"
|
2020-01-11 12:47:11 +01:00
|
|
|
require "json"
|
|
|
|
|
2020-01-02 09:21:11 +01:00
|
|
|
# keep track of connected users and their requests
|
|
|
|
# TODO: requests should be handled concurrently
|
|
|
|
class User
|
|
|
|
property uid : Int32
|
|
|
|
property token : FileStorage::Token
|
2020-01-04 15:07:04 +01:00
|
|
|
property uploads : Array(FileStorage::UploadRequest)
|
|
|
|
property downloads : Array(FileStorage::DownloadRequest)
|
2020-01-02 09:21:11 +01:00
|
|
|
|
2020-01-04 15:07:04 +01:00
|
|
|
def initialize(@token,
|
|
|
|
@uploads = Array(FileStorage::UploadRequest).new,
|
|
|
|
@downloads = Array(FileStorage::DownloadRequest).new)
|
2020-01-02 09:21:11 +01:00
|
|
|
@uid = token.uid
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-01-11 12:47:11 +01:00
|
|
|
class TransferInfo
|
|
|
|
include JSON::Serializable
|
|
|
|
|
|
|
|
property owner : Int32
|
2020-01-29 15:56:49 +01:00
|
|
|
property file_info : FileStorage::FileInfo
|
|
|
|
property chunks : Array(Int32)
|
2020-01-11 12:47:11 +01:00
|
|
|
|
|
|
|
def initialize(@owner, @file_info)
|
2020-01-29 15:56:49 +01:00
|
|
|
@chunks = [0...@file_info.nb_chunks]
|
2020-01-11 12:47:11 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-01-02 09:21:11 +01:00
|
|
|
class Context
|
2020-01-29 15:56:49 +01:00
|
|
|
class_property service_name = "filestorage"
|
|
|
|
class_property storage_directory = "./storage"
|
2020-01-11 12:47:11 +01:00
|
|
|
class_property file_info_directory = "./file-infos"
|
|
|
|
|
2020-01-29 15:56:49 +01:00
|
|
|
class_property db = DODB::DataBase(TransferInfo).new @@file_info_directory
|
|
|
|
|
|
|
|
# search file informations by their index, owner and tags
|
|
|
|
class_property db_by_filedigest : DODB::Index(TransferInfo) = @@db.new_index "filedigest", &.file_info.digest
|
|
|
|
class_property db_by_owner : DODB::Partition(TransferInfo) = @@db.new_partition "owner", &.owner.to_s
|
|
|
|
class_property db_by_tags : DODB::Tags(TransferInfo) = @@db.new_tags "tags", &.file_info.tags
|
|
|
|
|
|
|
|
def self.db_reconnect
|
|
|
|
# In case file_info_directory changes: database reinstanciation
|
2020-01-11 12:47:11 +01:00
|
|
|
|
|
|
|
@@db = DODB::DataBase(TransferInfo).new @@file_info_directory
|
|
|
|
|
2020-01-29 15:56:49 +01:00
|
|
|
# recreate indexes, partitions and tags objects, too
|
|
|
|
@@db_by_filedigest = @@db.new_index "filedigest", &.file_info.digest
|
|
|
|
@@db_by_owner = @@db.new_partition "owner", &.owner.to_s
|
|
|
|
@@db_by_tags = @@db.new_tags "tags", &.file_info.tags
|
2020-01-11 12:47:11 +01:00
|
|
|
end
|
2020-01-02 09:21:11 +01:00
|
|
|
|
|
|
|
# list of connected users (fd => uid)
|
|
|
|
class_property connected_users = Hash(Int32, Int32).new
|
|
|
|
|
|
|
|
# users_status: keep track of the users' status even if they are
|
|
|
|
# disconnected, allowing the application to handle connection problems
|
|
|
|
class_property users_status = Hash(Int32, User).new
|
|
|
|
|
|
|
|
class_property service : IPC::Service? = nil
|
|
|
|
end
|