From a8dbeb006ba16bb43f6449c56da755d2223d4b4b Mon Sep 17 00:00:00 2001
From: Philippe PITTOLI
Date: Fri, 13 Dec 2019 05:47:45 +0100
Subject: [PATCH] conversion seems to be ok
---
altsrc/common.cr | 41 +++++++++++++
altsrc/main.cr | 19 +++---
conversion.cr | 153 ++++++++++++++++++-----------------------------
shard.yml | 4 +-
4 files changed, 111 insertions(+), 106 deletions(-)
diff --git a/altsrc/common.cr b/altsrc/common.cr
index 0c6cd8b..4001649 100644
--- a/altsrc/common.cr
+++ b/altsrc/common.cr
@@ -38,6 +38,47 @@ class TodoD::List
}
@tasks = [] of String
end
+
+ def users_with_read_permissions : Array(Int32)
+ @permissions.map do |level, uids|
+ # Would raise on invalid level.
+ level = PermissionLevel.parse level
+
+ uids
+ end.flatten
+ end
+
+ def is_admin?(uid)
+ @permissions["admin"].any? &.==(uid)
+ end
+
+ def is_editor?(uid)
+ @permissions.any? do |level, uids|
+ level = PermissionLevel.parse level
+
+ uids.any? do |id|
+ id == uid && level >= PermissionLevel::Edit
+ end
+ end
+ end
+
+ def is_reader?(uid)
+ @permissions.any? do |level, uids|
+ level = PermissionLevel.parse level
+
+ uids.any? do |id|
+ id == uid && level >= PermissionLevel::Read
+ end
+ end
+ end
+
+ def set_permission(uid : Int32, level : PermissionLevel)
+ @permissions.each &.[1].select!(&.!=(uid))
+
+ return if level.none?
+
+ @permissions[level.to_s].push uid
+ end
end
class TodoD::Task
diff --git a/altsrc/main.cr b/altsrc/main.cr
index 9bfa9f9..fd79f24 100644
--- a/altsrc/main.cr
+++ b/altsrc/main.cr
@@ -2,21 +2,24 @@ require "option_parser"
require "uuid"
require "uuid/json"
-require "fs"
+
+
+require "dodb"
+
+
class TodoD::Storage
getter root : String
- getter lists : FS::Hash(String, List)
- getter tasks : FS::Hash(String, Task)
+ getter lists : DODB::DataBase(String, List)
+ getter tasks : DODB::DataBase(String, Task)
+ getter lists_per_user : DODB::Tags(List)
def initialize(@root)
- @lists = FS::Hash(String, List).new("#{@root}/lists").tap do |lists|
- lists.new_nn_partition "user", &.users_with_read_permissions.map(&.to_s)
- end
+ @lists = DODB::DataBase(String, List).new("#{@root}/lists")
+ @lists_per_user = @lists.new_tags "user", &.users_with_read_permissions.map(&.to_s)
- @tasks = FS::Hash(String, Task).new("#{@root}/tasks").tap do |tasks|
- end
+ @tasks = DODB::DataBase(String, Task).new("#{@root}/tasks")
end
def new_list(list)
diff --git a/conversion.cr b/conversion.cr
index f2e43e7..f568073 100644
--- a/conversion.cr
+++ b/conversion.cr
@@ -2,131 +2,92 @@
require "json"
require "./src/project.cr"
-# require "./altsrc/common.cr"
-# require "./altsrc/main.cr"
+require "./altsrc/common.cr"
+require "./altsrc/main.cr"
# 1. get the old list of projects
old_storage = Project.all "../storage/"
-# JSON.mapping({
-# id: String,
-# name: String,
-# columns: Array(Column),
-# tasks: Array(Task),
-# })
+# PROJECT: JSON.mapping({
+# PROJECT: id: String,
+# PROJECT: name: String,
+# PROJECT: columns: Array(Column),
+# PROJECT: tasks: Array(Task),
+# PROJECT: })
+
+# TASKS: JSON.mapping({
+# TASKS: id: String,
+# TASKS: author: Int32,
+# TASKS: title: String,
+# TASKS: description: String,
+# TASKS: column: String,
+# TASKS: assigned_to: Int32?,
+# TASKS: color: {
+# TASKS: type: String,
+# TASKS: default: "dark"
+# TASKS: }
+# TASKS: })
+
+# 2. create the new storage
+new_storage = TodoD::Storage.new "../new-storage/"
+
+
+# 3. for each project (old name for "list")
+# 3.1. get list properties
+# 3.2. get tasks, create new tasks and store them
+# 3.3. create and store the new list
+
+class User
+ property uid : Int32 = 1002
+end
-# 2. for each project
-# pp! old_storage
old_storage.each do |old_project|
+ puts ""
+ puts ""
+ puts ""
puts "projet #{old_project.name}"
+ # 3.1. get list properties
extra_properties = Hash(String, JSON::Any).new
extra_properties["columns"] = JSON.parse(old_project.columns.to_json)
- pp! extra_properties["columns"]
- # 1. create a new list an copy all properties
+ # 3.2. get tasks, create new tasks and store them
tasks = Array(TodoD::Task).new
old_project.tasks.each do |t|
- pp! t
+ # pp! t
+
+ # 1. get informations about the task
+ # 2. create a task in the new format
task_extra_properties = Hash(String, JSON::Any).new
- task_extra_properties["column"] = JSON.parse(t.column.to_json)
- task_extra_properties["backgroundColor"] = JSON.parse(t.column.to_json)
- task_extra_properties["assigneeId"] = JSON.parse(t.column.to_json)
+ task_extra_properties["column"] = JSON.parse(t.column.to_json)
+ task_extra_properties["backgroundColor"] = JSON.parse(t.color.to_json)
+ task_extra_properties["assigneeId"] = JSON.parse(t.assigned_to.to_json)
- newtask = ::TodoD::Task.new old_project.id, old_project.name, t.author,
+ newtask = ::TodoD::Task.new old_project.id, t.title, t.author,
description: (t.description || ""),
assigned_to: t.assigned_to,
extra_properties: task_extra_properties
-
- # TASK
-
- # @color="dark",
- # @description="",
- # @id="9808dcf2-1064-4b55-a39a-e402b477d60e",
- # @title="fsdb automatic tests">
-
-
- # 1. get the task in the old storage
- # TODO
- # 2. create a task in the new format
-
- # task = ::TodoD::Task.new @list.to_s, @title, user.uid,
- # description: (@description || ""),
- # assigned_to: @assigned_to,
- # extra_properties: @extra_properties || {} of String => JSON::Any
+ # pp! newtask
# 3. store the new task
- # list.tasks << task.id
- # service.storage.tasks[task.id] = task
+ tasks << newtask
+ new_storage.tasks[newtask.id] = newtask
end
# finally, create the list with all the parameters
- # list = List.new old_project.name, user, extra_properties
- # list.tasks = tasks.map &.id
+ u = User.new
+ list = TodoD::List.new old_project.name, u, extra_properties
+ list.tasks = tasks.map &.id
+ # puts ""
+ pp! list
-
-
-
- ####### service.storage.lists.delete list.id
-
- # Store the new list
- # service.storage.lists[list.id] = list
-
- # EDIT TASK
- # task = service.storage.tasks[@task.to_s]?
- # list = service.storage.lists[task.list.to_s]?
-
- # @title.try { |x| task.title = x }
- # @description.try { |x| task.description = x }
- # @tags.try { |x| task.tags = x }
- # @assigned_to.try { |x| task.assigned_to = x }
- # @extra_properties.try { |x| task.extra_properties = x }
-
- # service.storage.tasks.delete task.id
- # service.storage.tasks[task.id] = task
- # EDIT LIST
-
- # list = service.storage.lists[@list.to_s]
-
- # # Updating our list copy.
- # @title.try do |title|
- # list.title = title
- # end
-
- # @permissions.try do |permissions|
- # permissions.each do |key, value|
- # list.permissions[key] = value
- # end
- # end
-
- # @extra_properties.try do |properties|
- # properties.each do |key, value|
- # list.extra_properties[key] = value
- # end
- # end
-
- # # Removal and re-adding is the current way of handling updates.
- # service.storage.lists.delete list.id
- # service.storage.lists[list.id] = list
-
+ # finally, store the new list
+ new_storage.lists[list.id] = list
end
-
-# new_storage = TodoD::Storage.new "../new-storage/"
-
-# service.storage.lists.delete list.id
-# service.storage.lists.get_nn_partition(
-# service.storage.lists[list.id] = list
-# service.storage.lists[@list.to_s]
-# service.storage.lists[@list.to_s]?
-# service.storage.lists[task.list.to_s]?
-# service.storage.tasks.delete task.id
-# service.storage.tasks[task.id] = task
-# service.storage.tasks[@task.to_s]?
-# service.storage.tasks[uuid]
diff --git a/shard.yml b/shard.yml
index 7f7fcb5..d621b57 100644
--- a/shard.yml
+++ b/shard.yml
@@ -12,8 +12,8 @@ dependencies:
github: kemalcr/kemal
authd:
github: Lukc/authd
- fs:
- git: https://git.karchnu.fr/WeirdOS/fs.cr
+ dodb:
+ git: https://git.karchnu.fr/WeirdOS/dodb.cr
# pg:
# github: will/crystal-pg