twenty-server 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/twenty/server/graphql/input/task_input.rb +10 -0
- data/lib/twenty/server/graphql/input.rb +6 -0
- data/lib/twenty/server/graphql/mutation/complete_task.rb +17 -0
- data/lib/twenty/server/graphql/mutation/create_task.rb +15 -0
- data/lib/twenty/server/graphql/mutation/destroy_task.rb +17 -0
- data/lib/twenty/server/graphql/mutation/set_random_project_color.rb +18 -0
- data/lib/twenty/server/graphql/mutation/update_task.rb +18 -0
- data/lib/twenty/server/graphql/mutation.rb +11 -0
- data/lib/twenty/server/graphql/schema.rb +8 -0
- data/lib/twenty/server/graphql/type/mutation.rb +11 -0
- data/lib/twenty/server/graphql/type/project.rb +11 -0
- data/lib/twenty/server/graphql/type/query.rb +29 -0
- data/lib/twenty/server/graphql/type/task.rb +16 -0
- data/lib/twenty/server/graphql/type/task_status.rb +10 -0
- data/lib/twenty/server/graphql/type.rb +12 -0
- data/lib/twenty/server/graphql.rb +9 -0
- data/lib/twenty/server/migration/1_create_projects.rb +18 -0
- data/lib/twenty/server/migration/2_create_tasks.rb +19 -0
- data/lib/twenty/server/migration/3_add_color_to_projects.rb +12 -0
- data/lib/twenty/server/migration.rb +25 -0
- data/lib/twenty/server/model/mixin/colorable_mixin.rb +32 -0
- data/lib/twenty/server/model/project.rb +17 -0
- data/lib/twenty/server/model/task.rb +32 -0
- data/lib/twenty/server/model.rb +12 -0
- data/lib/twenty/server/path.rb +31 -0
- data/lib/twenty/server/rack/graphql.rb +31 -0
- data/lib/twenty/server/rack.rb +15 -0
- data/share/twenty/server/schema.graphql +91 -0
- metadata +155 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 677398c56ecfd535bdec6de36fbb5507f441963d22efad8e29e80dc73abc77b7
|
4
|
+
data.tar.gz: 00c807ce51fae09f47c08667af8e740f69d2b141676565acfe502dfa71f2a654
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 19de180d8c0c9dfcd51a8dc27cfd6c9b12bd6fa5b40607d5cede8720c797e240d14a377a437a025ad9747e03029d15294f5880c885e0c7bee164b99712df5983
|
7
|
+
data.tar.gz: ef1b9cc9b9d74381c52b4a1d6400429485127dcfcb905258c11e63ccba7888026b94ad3c35b54a535ea41f77baabc5f4343fab72fd092c82eafa5d9b1ef50fed
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Twenty::GraphQL::Input
|
4
|
+
class TaskInput < GraphQL::Schema::InputObject
|
5
|
+
argument :title, String, required: false
|
6
|
+
argument :content, String, required: false
|
7
|
+
argument :project_id, Int, required: false
|
8
|
+
argument :status, "Twenty::GraphQL::Type::TaskStatus", required: false
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Twenty::GraphQL::Mutation
|
4
|
+
class CompleteTask < GraphQL::Schema::Mutation
|
5
|
+
argument :task_id, Int
|
6
|
+
field :ok, Boolean
|
7
|
+
field :errors, [String]
|
8
|
+
|
9
|
+
def resolve(task_id:)
|
10
|
+
task = Twenty::Task.find(task_id)
|
11
|
+
task.update!(status: :complete)
|
12
|
+
{ok: true, errors: []}
|
13
|
+
rescue => ex
|
14
|
+
{ok: false, errors: [ex.message]}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Twenty::GraphQL::Mutation
|
4
|
+
class CreateTask < GraphQL::Schema::Mutation
|
5
|
+
field :errors, [String], null: false
|
6
|
+
argument :input, Twenty::GraphQL::Input::TaskInput
|
7
|
+
|
8
|
+
def resolve(input:)
|
9
|
+
Twenty::Task.create input.to_h.merge(status: :backlog)
|
10
|
+
{"errors" => []}
|
11
|
+
rescue => ex
|
12
|
+
{"errors" => [ex.message]}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Twenty::GraphQL::Mutation
|
4
|
+
class DestroyTask < GraphQL::Schema::Mutation
|
5
|
+
argument :task_id, Int
|
6
|
+
field :ok, Boolean
|
7
|
+
field :errors, [String]
|
8
|
+
|
9
|
+
def resolve(task_id:)
|
10
|
+
task = Twenty::Task.find(task_id)
|
11
|
+
task.destroy!
|
12
|
+
{ok: true, errors: []}
|
13
|
+
rescue => ex
|
14
|
+
{ok: false, errors: [ex.message]}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Twenty::GraphQL::Mutation
|
4
|
+
class SetRandomProjectColor < ::GraphQL::Schema::Mutation
|
5
|
+
argument :project_id, Int, required: true
|
6
|
+
|
7
|
+
field :errors, [String], null: false
|
8
|
+
field :project, "Twenty::GraphQL::Type::Project", null: true
|
9
|
+
|
10
|
+
def resolve(project_id:)
|
11
|
+
project = Twenty::Project.with_pk!(project_id)
|
12
|
+
project.update(color: project.random_color)
|
13
|
+
{errors: [], project:}
|
14
|
+
rescue => ex
|
15
|
+
{errors: [ex.message]}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Twenty::GraphQL::Mutation
|
4
|
+
class UpdateTask < GraphQL::Schema::Mutation
|
5
|
+
field :errors, [String], null: false
|
6
|
+
argument :task_id, Int
|
7
|
+
argument :input, Twenty::GraphQL::Input::TaskInput
|
8
|
+
|
9
|
+
def resolve(task_id:, input:)
|
10
|
+
Twenty::Task
|
11
|
+
.with_pk!(task_id)
|
12
|
+
.update(input.to_h)
|
13
|
+
{"errors" => []}
|
14
|
+
rescue => ex
|
15
|
+
{"errors" => [ex.message]}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Twenty::GraphQL
|
4
|
+
module Mutation
|
5
|
+
require_relative "mutation/destroy_task"
|
6
|
+
require_relative "mutation/complete_task"
|
7
|
+
require_relative "mutation/create_task"
|
8
|
+
require_relative "mutation/update_task"
|
9
|
+
require_relative "mutation/set_random_project_color"
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Twenty::GraphQL::Type
|
4
|
+
class Mutation < GraphQL::Schema::Object
|
5
|
+
field :destroy_task, mutation: Twenty::GraphQL::Mutation::DestroyTask
|
6
|
+
field :complete_task, mutation: Twenty::GraphQL::Mutation::CompleteTask
|
7
|
+
field :create_task, mutation: Twenty::GraphQL::Mutation::CreateTask
|
8
|
+
field :update_task, mutation: Twenty::GraphQL::Mutation::UpdateTask
|
9
|
+
field :set_random_project_color, mutation: Twenty::GraphQL::Mutation::SetRandomProjectColor
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Twenty::GraphQL::Type
|
4
|
+
class Project < GraphQL::Schema::Object
|
5
|
+
field :id, Int, null: false
|
6
|
+
field :name, String, null: false
|
7
|
+
field :path, String, null: false
|
8
|
+
field :color, String, null: false
|
9
|
+
field :tasks, "[Twenty::GraphQL::Type::Task]", null: false
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Twenty::GraphQL::Type
|
4
|
+
class Query < GraphQL::Schema::Object
|
5
|
+
field :find_task, Task, null: true do
|
6
|
+
argument :task_id, Int
|
7
|
+
end
|
8
|
+
field :tasks, [Task], null: false do
|
9
|
+
argument :status, TaskStatus
|
10
|
+
argument :project_id, Int, required: false
|
11
|
+
end
|
12
|
+
field :projects, [Project], null: false
|
13
|
+
|
14
|
+
def find_task(task_id:)
|
15
|
+
Twenty::Task.with_pk!(task_id)
|
16
|
+
end
|
17
|
+
|
18
|
+
def tasks(status:, project_id: nil)
|
19
|
+
tasks = Twenty::Task
|
20
|
+
.by_status(status)
|
21
|
+
.order("updated_at DESC")
|
22
|
+
(project_id ? tasks.where(project_id:) : tasks).all
|
23
|
+
end
|
24
|
+
|
25
|
+
def projects
|
26
|
+
Twenty::Project.all
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Twenty::GraphQL::Type
|
4
|
+
class Task < GraphQL::Schema::Object
|
5
|
+
field :id, Int, null: false
|
6
|
+
field :title, String, null: false
|
7
|
+
field :status, "Twenty::GraphQL::Type::TaskStatus", null: false
|
8
|
+
field :content, String, null: false
|
9
|
+
field :project, "Twenty::GraphQL::Type::Project", null: false
|
10
|
+
field :updated_at, GraphQL::Types::ISO8601DateTime, null: false
|
11
|
+
field :is_ready, Boolean, null: false, method: :ready?
|
12
|
+
field :is_backlogged, Boolean, null: false, method: :backlog?
|
13
|
+
field :is_complete, Boolean, null: false, method: :complete?
|
14
|
+
field :in_progress, Boolean, null: false, method: :in_progress?
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Twenty::GraphQL
|
4
|
+
module Type
|
5
|
+
include ::GraphQL::Types
|
6
|
+
end
|
7
|
+
require_relative "type/task_status"
|
8
|
+
require_relative "type/project"
|
9
|
+
require_relative "type/task"
|
10
|
+
require_relative "type/query"
|
11
|
+
require_relative "type/mutation"
|
12
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Sequel.migration do
|
4
|
+
up do
|
5
|
+
create_table(:projects) do
|
6
|
+
primary_key :id
|
7
|
+
String :name, null: false
|
8
|
+
String :path, null: false
|
9
|
+
DateTime :created_at
|
10
|
+
DateTime :updated_at
|
11
|
+
end
|
12
|
+
add_index :projects, [:name, :path], unique: true
|
13
|
+
end
|
14
|
+
|
15
|
+
down do
|
16
|
+
drop_table(:projects)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Sequel.migration do
|
4
|
+
up do
|
5
|
+
create_table(:tasks) do |t|
|
6
|
+
primary_key :id
|
7
|
+
String :title, null: false
|
8
|
+
Text :content, null: false
|
9
|
+
Integer :status, null: false, default: 0
|
10
|
+
DateTime :created_at
|
11
|
+
DateTime :updated_at
|
12
|
+
foreign_key :project_id, :projects, null: false
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
down do
|
17
|
+
drop_table(:tasks)
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Twenty::Migration
|
4
|
+
require "sequel/extensions/migration"
|
5
|
+
##
|
6
|
+
# @return [String]
|
7
|
+
# Returns the path to twenty's migrations.
|
8
|
+
def self.migrations_path
|
9
|
+
File.join(__dir__, "migration")
|
10
|
+
end
|
11
|
+
|
12
|
+
##
|
13
|
+
# Runs migrations (if neccessary).
|
14
|
+
# @return [void]
|
15
|
+
def self.run!
|
16
|
+
Sequel::Migrator.run(Twenty.connection, migrations_path)
|
17
|
+
end
|
18
|
+
|
19
|
+
##
|
20
|
+
# @return [Boolean]
|
21
|
+
# Returns true when there are pending migrations.
|
22
|
+
def self.pending_migrations?
|
23
|
+
Sequel::Migrator.is_current?(Twenty.connection, migrations_path)
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Twenty::ColorableMixin
|
4
|
+
extend self
|
5
|
+
|
6
|
+
COLORS = [
|
7
|
+
"#222222", "#333333", "#444444", "#555555", "#666666",
|
8
|
+
"#777777", "#888888", "#999999", "#AA2222", "#22AA22",
|
9
|
+
"#2222AA", "#AA22AA", "#CC9900", "#0099CC", "#9900CC",
|
10
|
+
"#FF9900", "#00CC99", "#99CC00", "#CC0099", "#990000",
|
11
|
+
"#112233", "#445566", "#778899", "#AA4455", "#5544AA",
|
12
|
+
"#88AA44", "#AA88AA", "#CCBB00", "#1155CC", "#9900BB",
|
13
|
+
"#DD6600", "#00BBCC", "#CC0099", "#BB3300", "#006688",
|
14
|
+
"#993366", "#2200AA", "#557788", "#998877", "#BB4400"
|
15
|
+
]
|
16
|
+
|
17
|
+
def before_validation
|
18
|
+
super if defined?(super)
|
19
|
+
set_random_color
|
20
|
+
end
|
21
|
+
|
22
|
+
def random_color
|
23
|
+
COLORS.sample
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def set_random_color
|
29
|
+
return if id
|
30
|
+
self.color = random_color
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Twenty::Project < Sequel::Model
|
4
|
+
include Twenty::Model
|
5
|
+
include Twenty::ColorableMixin
|
6
|
+
|
7
|
+
validates_presence_of :name
|
8
|
+
validates_presence_of :path
|
9
|
+
one_to_many :tasks, class_name: "Twenty::Task"
|
10
|
+
|
11
|
+
##
|
12
|
+
# @return [String]
|
13
|
+
# The path to a project.
|
14
|
+
def path
|
15
|
+
super&.sub(Dir.home, "~")
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Twenty::Task < Sequel::Model
|
4
|
+
include Twenty::Model
|
5
|
+
|
6
|
+
plugin(:enum)
|
7
|
+
STATUS_MAP = {backlog: 0, ready: 1, in_progress: 2, complete: 3}
|
8
|
+
STATUS_KEYS = STATUS_MAP.keys
|
9
|
+
enum :status, STATUS_MAP
|
10
|
+
|
11
|
+
def self.by_status(status)
|
12
|
+
if STATUS_KEYS.any? { _1.to_s == status.to_s }
|
13
|
+
public_send(status)
|
14
|
+
else
|
15
|
+
where(id: nil)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
validates_presence_of :title
|
20
|
+
validates_presence_of :content
|
21
|
+
validates_presence_of :project
|
22
|
+
validates_inclusion_of :status, in: [STATUS_KEYS, *STATUS_KEYS.map(&:to_s)]
|
23
|
+
many_to_one :project, class_name: "Twenty::Project"
|
24
|
+
|
25
|
+
def status=(v)
|
26
|
+
super(v.to_sym)
|
27
|
+
end
|
28
|
+
|
29
|
+
def status
|
30
|
+
super.to_s
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Twenty::Model
|
4
|
+
def self.included(model)
|
5
|
+
model.plugin(:validation_class_methods)
|
6
|
+
model.plugin(:timestamps, update_on_create: true)
|
7
|
+
end
|
8
|
+
|
9
|
+
require_relative "model/mixin/colorable_mixin"
|
10
|
+
require_relative "model/project"
|
11
|
+
require_relative "model/task"
|
12
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Twenty::Path
|
4
|
+
require "tmpdir"
|
5
|
+
extend self
|
6
|
+
|
7
|
+
##
|
8
|
+
# @return [String]
|
9
|
+
# Returns the directory where twenty stores persistent data.
|
10
|
+
def datadir
|
11
|
+
File.join(Dir.home, ".local", "share", "twenty")
|
12
|
+
end
|
13
|
+
|
14
|
+
##
|
15
|
+
# @return [String]
|
16
|
+
# Returns the directory where twenty stores temporary data.
|
17
|
+
def tmpdir
|
18
|
+
File.join(Dir.tmpdir, "twenty")
|
19
|
+
end
|
20
|
+
|
21
|
+
##
|
22
|
+
# @return [String]
|
23
|
+
# Returns the file where twenty can write the PID of
|
24
|
+
# a web server running in the background.
|
25
|
+
def pidfile
|
26
|
+
File.join(tmpdir, "server.pid")
|
27
|
+
end
|
28
|
+
|
29
|
+
FileUtils.mkdir_p(datadir)
|
30
|
+
FileUtils.mkdir_p(tmpdir)
|
31
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Twenty::Rack
|
4
|
+
module GraphQL
|
5
|
+
##
|
6
|
+
# Extends {Server::Dir Server::Dir} (a static file
|
7
|
+
# Rack application) with a /graphql endpoint.
|
8
|
+
#
|
9
|
+
# @param [Hash] env
|
10
|
+
# Environment hash.
|
11
|
+
#
|
12
|
+
# @return [Array<Integer, Hash, #each>]
|
13
|
+
# Returns a response.
|
14
|
+
def call(env)
|
15
|
+
req = Rack::Request.new(env)
|
16
|
+
if req.post? &&
|
17
|
+
req.path == "/graphql"
|
18
|
+
params = JSON.parse(req.body.string)
|
19
|
+
result = Twenty::GraphQL::Schema.execute(
|
20
|
+
params["query"],
|
21
|
+
variables: params["variables"],
|
22
|
+
context: {}
|
23
|
+
)
|
24
|
+
[200, {"content-type" => "application/json"}, [result.to_json]]
|
25
|
+
else
|
26
|
+
super(env)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
Server::Dir.prepend(self)
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Twenty::Rack
|
4
|
+
require "server"
|
5
|
+
require_relative "rack/graphql"
|
6
|
+
|
7
|
+
##
|
8
|
+
# @param [Hash] options
|
9
|
+
# A hash of server options.
|
10
|
+
#
|
11
|
+
# @return [Thread]
|
12
|
+
def self.server(options = {})
|
13
|
+
Server.dir(Twenty.build, options.to_h)
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
"""
|
2
|
+
Autogenerated return type of CompleteTask.
|
3
|
+
"""
|
4
|
+
type CompleteTaskPayload {
|
5
|
+
errors: [String!]
|
6
|
+
ok: Boolean
|
7
|
+
}
|
8
|
+
|
9
|
+
"""
|
10
|
+
Autogenerated return type of CreateTask.
|
11
|
+
"""
|
12
|
+
type CreateTaskPayload {
|
13
|
+
errors: [String!]!
|
14
|
+
}
|
15
|
+
|
16
|
+
"""
|
17
|
+
Autogenerated return type of DestroyTask.
|
18
|
+
"""
|
19
|
+
type DestroyTaskPayload {
|
20
|
+
errors: [String!]
|
21
|
+
ok: Boolean
|
22
|
+
}
|
23
|
+
|
24
|
+
"""
|
25
|
+
An ISO 8601-encoded datetime
|
26
|
+
"""
|
27
|
+
scalar ISO8601DateTime @specifiedBy(url: "https://tools.ietf.org/html/rfc3339")
|
28
|
+
|
29
|
+
type Mutation {
|
30
|
+
completeTask(taskId: Int!): CompleteTaskPayload
|
31
|
+
createTask(input: TaskInput!): CreateTaskPayload
|
32
|
+
destroyTask(taskId: Int!): DestroyTaskPayload
|
33
|
+
setRandomProjectColor(projectId: Int!): SetRandomProjectColorPayload
|
34
|
+
updateTask(input: TaskInput!, taskId: Int!): UpdateTaskPayload
|
35
|
+
}
|
36
|
+
|
37
|
+
type Project {
|
38
|
+
color: String!
|
39
|
+
id: Int!
|
40
|
+
name: String!
|
41
|
+
path: String!
|
42
|
+
tasks: [Task!]!
|
43
|
+
}
|
44
|
+
|
45
|
+
type Query {
|
46
|
+
findTask(taskId: Int!): Task
|
47
|
+
projects: [Project!]!
|
48
|
+
tasks(projectId: Int, status: TaskStatus!): [Task!]!
|
49
|
+
}
|
50
|
+
|
51
|
+
"""
|
52
|
+
Autogenerated return type of SetRandomProjectColor.
|
53
|
+
"""
|
54
|
+
type SetRandomProjectColorPayload {
|
55
|
+
errors: [String!]!
|
56
|
+
project: Project
|
57
|
+
}
|
58
|
+
|
59
|
+
type Task {
|
60
|
+
content: String!
|
61
|
+
id: Int!
|
62
|
+
inProgress: Boolean!
|
63
|
+
isBacklogged: Boolean!
|
64
|
+
isComplete: Boolean!
|
65
|
+
isReady: Boolean!
|
66
|
+
project: Project!
|
67
|
+
status: TaskStatus!
|
68
|
+
title: String!
|
69
|
+
updatedAt: ISO8601DateTime!
|
70
|
+
}
|
71
|
+
|
72
|
+
input TaskInput {
|
73
|
+
content: String
|
74
|
+
projectId: Int
|
75
|
+
status: TaskStatus
|
76
|
+
title: String
|
77
|
+
}
|
78
|
+
|
79
|
+
enum TaskStatus {
|
80
|
+
backlog
|
81
|
+
complete
|
82
|
+
in_progress
|
83
|
+
ready
|
84
|
+
}
|
85
|
+
|
86
|
+
"""
|
87
|
+
Autogenerated return type of UpdateTask.
|
88
|
+
"""
|
89
|
+
type UpdateTaskPayload {
|
90
|
+
errors: [String!]!
|
91
|
+
}
|
metadata
ADDED
@@ -0,0 +1,155 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: twenty-server
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.4.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- '0x1eef'
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2024-04-25 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sequel
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5.78'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '5.78'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: sqlite3
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.6'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.6'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: graphql
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.2'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.2'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: server.rb
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.1'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.1'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: test-unit
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 3.5.7
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 3.5.7
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: standard
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.35'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.35'
|
97
|
+
description: HTTP server
|
98
|
+
email:
|
99
|
+
- 0x1eef@protonmail.com
|
100
|
+
executables: []
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- "./lib/twenty/server/graphql.rb"
|
105
|
+
- "./lib/twenty/server/graphql/input.rb"
|
106
|
+
- "./lib/twenty/server/graphql/input/task_input.rb"
|
107
|
+
- "./lib/twenty/server/graphql/mutation.rb"
|
108
|
+
- "./lib/twenty/server/graphql/mutation/complete_task.rb"
|
109
|
+
- "./lib/twenty/server/graphql/mutation/create_task.rb"
|
110
|
+
- "./lib/twenty/server/graphql/mutation/destroy_task.rb"
|
111
|
+
- "./lib/twenty/server/graphql/mutation/set_random_project_color.rb"
|
112
|
+
- "./lib/twenty/server/graphql/mutation/update_task.rb"
|
113
|
+
- "./lib/twenty/server/graphql/schema.rb"
|
114
|
+
- "./lib/twenty/server/graphql/type.rb"
|
115
|
+
- "./lib/twenty/server/graphql/type/mutation.rb"
|
116
|
+
- "./lib/twenty/server/graphql/type/project.rb"
|
117
|
+
- "./lib/twenty/server/graphql/type/query.rb"
|
118
|
+
- "./lib/twenty/server/graphql/type/task.rb"
|
119
|
+
- "./lib/twenty/server/graphql/type/task_status.rb"
|
120
|
+
- "./lib/twenty/server/migration.rb"
|
121
|
+
- "./lib/twenty/server/migration/1_create_projects.rb"
|
122
|
+
- "./lib/twenty/server/migration/2_create_tasks.rb"
|
123
|
+
- "./lib/twenty/server/migration/3_add_color_to_projects.rb"
|
124
|
+
- "./lib/twenty/server/model.rb"
|
125
|
+
- "./lib/twenty/server/model/mixin/colorable_mixin.rb"
|
126
|
+
- "./lib/twenty/server/model/project.rb"
|
127
|
+
- "./lib/twenty/server/model/task.rb"
|
128
|
+
- "./lib/twenty/server/path.rb"
|
129
|
+
- "./lib/twenty/server/rack.rb"
|
130
|
+
- "./lib/twenty/server/rack/graphql.rb"
|
131
|
+
- "./share/twenty/server/schema.graphql"
|
132
|
+
homepage: https://github.com/0x1eef/twenty#readme
|
133
|
+
licenses:
|
134
|
+
- 0BSD
|
135
|
+
metadata: {}
|
136
|
+
post_install_message:
|
137
|
+
rdoc_options: []
|
138
|
+
require_paths:
|
139
|
+
- lib
|
140
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
141
|
+
requirements:
|
142
|
+
- - ">="
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '0'
|
145
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
146
|
+
requirements:
|
147
|
+
- - ">="
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
150
|
+
requirements: []
|
151
|
+
rubygems_version: 3.5.9
|
152
|
+
signing_key:
|
153
|
+
specification_version: 4
|
154
|
+
summary: HTTP server
|
155
|
+
test_files: []
|