typesense/include/collection_manager.h
Kishore Nallan de80250de9 Extract authentication logic into a separate handler.
It is now possible to define a separate key for search end-point alone as well. This will be used when one needs to call the API directly from Javascript.
2017-12-12 18:10:08 +05:30

75 lines
2.4 KiB
C++

#pragma once
#include <iostream>
#include <string>
#include <sparsepp.h>
#include "store.h"
#include "field.h"
#include "collection.h"
// Singleton, for managing meta information of all collections and house keeping
class CollectionManager {
private:
Store *store;
spp::sparse_hash_map<std::string, Collection*> collections;
spp::sparse_hash_map<uint32_t, std::string> collection_id_names;
// Auto incrementing ID assigned to each collection
// Using a ID instead of a collection's name makes renaming possible
uint32_t next_collection_id;
static constexpr const char* COLLECTION_NAME_KEY = "name";
static constexpr const char* COLLECTION_ID_KEY = "id";
static constexpr const char* COLLECTION_SEARCH_FIELDS_KEY = "fields";
static constexpr const char* COLLECTION_TOKEN_ORDERING_FIELD_KEY = "token_ranking_field";
std::string auth_key;
std::string search_only_auth_key;
CollectionManager();
~CollectionManager() = default;
public:
static CollectionManager & get_instance() {
static CollectionManager instance;
return instance;
}
CollectionManager(CollectionManager const&) = delete;
void operator=(CollectionManager const&) = delete;
Option<bool> init(Store *store, const std::string & auth_key, const std::string & search_only_auth_key);
// frees in-memory data structures when server is shutdown - helps us run a memory leak detecter properly
void dispose();
Collection* init_collection(const nlohmann::json & collection_meta, const uint32_t collection_next_seq_id);
void add_to_collections(Collection* collection);
bool auth_key_matches(std::string auth_key_sent);
bool search_only_auth_key_matches(std::string auth_key_sent);
Option<Collection*> create_collection(std::string name, const std::vector<field> & fields,
const std::string & token_ranking_field = "");
Collection* get_collection(const std::string & collection_name);
Collection* get_collection_with_id(uint32_t collection_id);
std::vector<Collection*> get_collections();
Option<bool> drop_collection(std::string collection_name, const bool remove_from_store = true);
uint32_t get_next_collection_id();
void set_next_collection_id(uint32_t next_id);
Store* get_store();
static constexpr const char* NEXT_COLLECTION_ID_KEY = "$CI";
};