47 lines
1.5 KiB
D
47 lines
1.5 KiB
D
|
module data.impl.user;
|
||
|
|
||
|
import std.file;
|
||
|
import std.path;
|
||
|
import std.json;
|
||
|
import std.typecons;
|
||
|
|
||
|
import data.user;
|
||
|
|
||
|
immutable string USERS_DIR = "users";
|
||
|
immutable string DATA_FILE = "user.json";
|
||
|
immutable string DB_FILE = "notes.sqlite";
|
||
|
|
||
|
class FileSystemUserDataSource : UserDataSource {
|
||
|
User createUser(string username, string email, string passwordHash) {
|
||
|
string dirPath = buildPath(USERS_DIR, username);
|
||
|
if (exists(dirPath)) throw new Exception("User already has a directory.");
|
||
|
mkdirRecurse(dirPath);
|
||
|
string dataPath = buildPath(dirPath, DATA_FILE);
|
||
|
JSONValue userObj = JSONValue(string[string].init);
|
||
|
userObj.object["username"] = username;
|
||
|
userObj.object["email"] = email;
|
||
|
userObj.object["passwordHash"] = passwordHash;
|
||
|
std.file.write(dataPath, userObj.toPrettyString());
|
||
|
return User(username, email, passwordHash);
|
||
|
}
|
||
|
|
||
|
void deleteUser(string username) {
|
||
|
string dirPath = buildPath(USERS_DIR, username);
|
||
|
if (exists(dirPath)) rmdirRecurse(dirPath);
|
||
|
}
|
||
|
|
||
|
Nullable!User getUser(string username) {
|
||
|
import std.string : strip;
|
||
|
string dataPath = buildPath(USERS_DIR, username, DATA_FILE);
|
||
|
if (exists(dataPath) && isFile(dataPath)) {
|
||
|
JSONValue userObj = parseJSON(strip(readText(dataPath)));
|
||
|
return nullable(User(
|
||
|
userObj.object["username"].str,
|
||
|
userObj.object["email"].str,
|
||
|
userObj.object["passwordHash"].str
|
||
|
));
|
||
|
}
|
||
|
return Nullable!User.init;
|
||
|
}
|
||
|
}
|