diff --git a/.gitignore b/.gitignore index 369bf78..665fef9 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,6 @@ nginx.conf.compiled db.*.sqlite .vscode/ .local/ -static/avatars/ +static/avatars/* +!static/avatars/default.webp secrets.lua diff --git a/apps/users.lua b/apps/users.lua index 0d11dde..341f4a9 100644 --- a/apps/users.lua +++ b/apps/users.lua @@ -150,8 +150,10 @@ app:post("user_clear_avatar", "/:username/clear_avatar", function(self) if me.id ~= target_user.id then return {redirect_to = self:url_for("user", {username = self.params.username})} end + local old_avatar_id = target_user.avatar_id + util.destroy_avatar(old_avatar_id) target_user:update({ - avatar_id = db.NULL, + avatar_id = 1, }) util.inject_infobox(self, "Avatar cleared.") return {redirect_to = self:url_for("user_settings", {username = self.params.username})} diff --git a/create_default_accounts.lua b/create_default_accounts.lua index aab40ed..318bbff 100644 --- a/create_default_accounts.lua +++ b/create_default_accounts.lua @@ -4,6 +4,17 @@ local constants = require("constants") local alphabet = "-_@0123456789abcdefghijklmnopqrstuvwABCDEFGHIJKLMNOPQRSTUVWXYZ" +local function create_default_avatar() + if models.Avatars:count() > 0 then + print("default avatar must exist") + return + end + models.Avatars:create({ + file_path = "/avatars/default.webp", + uploaded_at = os.time(), + }) +end + local function create_admin() local username = "admin" local root_count = models.Users:count("username = ?", username) @@ -44,5 +55,6 @@ local function create_deleted_user() }) end +create_default_avatar() create_admin() create_deleted_user() diff --git a/migrations.lua b/migrations.lua index 8709a74..7ed91e9 100644 --- a/migrations.lua +++ b/migrations.lua @@ -52,4 +52,10 @@ return { [6] = function () schema.drop_column("post_history", "user_id") end, + + [7] = function () + db.query('DROP INDEX "idx_users_avatar"') + schema.drop_column("users", "avatar_id") + schema.add_column("users", "avatar_id", "REFERENCES avatars(id) DEFAULT 1") + end } diff --git a/models.lua b/models.lua index 8466db0..24ee4e5 100644 --- a/models.lua +++ b/models.lua @@ -25,7 +25,7 @@ function Users_mt:is_logged_in_guest() end function Users_mt:is_default_avatar() - return self.avatar_id == nil + return self.avatar_id == 1 end function Users_mt:is_logged_in() diff --git a/static/avatars/default.webp b/static/avatars/default.webp new file mode 100644 index 0000000..a352e1b Binary files /dev/null and b/static/avatars/default.webp differ diff --git a/util.lua b/util.lua index 044b8b0..54f2314 100644 --- a/util.lua +++ b/util.lua @@ -34,9 +34,6 @@ util.TransientUser = { } function util.get_user_avatar_url(req, user) - if not user.avatar_id then - return "/avatars/default.webp" - end return Avatars:find(user.avatar_id).file_path end @@ -72,6 +69,28 @@ function util.validate_and_create_image(input_image, filename) return true end +function util.destroy_avatar(avatar_id) + if avatar_id == 1 then + print("won't delete default avatar") + return + end + + local avatar = Avatars:find(avatar_id) + + if not avatar then + return + end + + local file_path = "static" .. avatar.file_path + local f = io.open(file_path, "r") + if not f then + print("can't open avatar file") + else + f:close() + os.remove(file_path) + end +end + function util.get_logged_in_user(req) if req.session.session_key == nil then return nil diff --git a/views/threads/post.etlua b/views/threads/post.etlua index 6ac2652..44f4597 100644 --- a/views/threads/post.etlua +++ b/views/threads/post.etlua @@ -1,7 +1,7 @@