twenty-backend 0.3.4 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/lib/twenty-backend/graphql/input/task_input.rb +9 -0
  3. data/lib/twenty-backend/graphql/input.rb +4 -0
  4. data/lib/twenty-backend/graphql/mutation/complete_task.rb +15 -0
  5. data/lib/twenty-backend/graphql/mutation/create_task.rb +13 -0
  6. data/lib/twenty-backend/graphql/mutation/destroy_task.rb +15 -0
  7. data/lib/twenty-backend/graphql/mutation/set_random_project_color.rb +17 -0
  8. data/lib/twenty-backend/graphql/mutation/update_task.rb +15 -0
  9. data/lib/twenty-backend/graphql/mutation.rb +5 -0
  10. data/lib/twenty-backend/graphql/schema.rb +6 -0
  11. data/lib/twenty-backend/graphql/type/mutation.rb +14 -0
  12. data/lib/twenty-backend/graphql/type/project.rb +10 -0
  13. data/lib/twenty-backend/graphql/type/query.rb +27 -0
  14. data/lib/twenty-backend/graphql/type/task.rb +15 -0
  15. data/lib/twenty-backend/graphql/type/task_status.rb +8 -0
  16. data/lib/twenty-backend/graphql/type.rb +10 -0
  17. data/lib/twenty-backend/graphql.rb +7 -0
  18. data/lib/twenty-backend/migration/1_create_projects.rb +16 -0
  19. data/lib/twenty-backend/migration/2_create_tasks.rb +17 -0
  20. data/lib/twenty-backend/migration/3_add_color_to_projects.rb +10 -0
  21. data/lib/twenty-backend/migration.rb +34 -0
  22. data/lib/twenty-backend/model/mixin/colorable_mixin.rb +28 -0
  23. data/lib/twenty-backend/model/project.rb +22 -0
  24. data/lib/twenty-backend/model/task.rb +18 -0
  25. data/lib/twenty-backend/model.rb +7 -0
  26. data/lib/twenty-backend/servlet/graphql.rb +15 -0
  27. data/lib/twenty-backend/servlet/mixin/server_mixin.rb +27 -0
  28. data/lib/twenty-backend/servlet.rb +12 -0
  29. data/lib/twenty-backend.rb +55 -0
  30. data/share/twenty-backend/schema.graphql +91 -0
  31. metadata +32 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 98b68e3768a220ad9a15cb7463606be7ceecd9ec724050a70fadfc1aa598e20b
4
- data.tar.gz: 3c25ca218e14184a5dc37012e252b8712c0485aeab6f25cfe0e32e9bad212b48
3
+ metadata.gz: 67194d6fb4501a193b1b8afcdc47262fa17733e7b3a569a858e8055e65d63841
4
+ data.tar.gz: 29ce99129bc682c0cb3713c2c7baaf91647cff4d999fbe4587d362a5e19e16b0
5
5
  SHA512:
6
- metadata.gz: c6dc81bc79b91423c1829ecc9344e0d4b7cdf5391323be40d87db0649d9ba75e5290848ebdb5a4914f53b8758f92d19a1493ea1a388befb00d5295eb8086f93a
7
- data.tar.gz: 51cfd7a902aa38b6123750c9927dd14eaa3b26bfdc11edfb3bdd34e8e540ce8f20b3c40b9cf067e49058e629d37cb0fec61c0faa72393c32676245e6ea544696
6
+ metadata.gz: 256f82f48191c084384bee5f369921214a5634460e4f30298bda66f788b4f3f619419959a5a95d37d4c78f537e9ae013cb47e839be13dd8351d8e79abc01b847
7
+ data.tar.gz: 5d4c458aee402d670b9d64b6cb01a97d2d0e9ec2f4b371d5f52dab5c407fef2f1380f8f6d5d75798fd8155822e72370753779412a8cb3235a12d7b6af3192e4f
@@ -0,0 +1,9 @@
1
+ module Twenty::GraphQL::Input
2
+ class TaskInput < GraphQL::Schema::InputObject
3
+ require_relative "../type/task_status"
4
+ argument :title, String, required: false
5
+ argument :content, String, required: false
6
+ argument :project_id, Int, required: false
7
+ argument :status, Twenty::GraphQL::Type::TaskStatus, required: false
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ module Twenty::GraphQL::Input
2
+ include GraphQL::Types
3
+ require_relative "input/task_input"
4
+ end
@@ -0,0 +1,15 @@
1
+ module Twenty::GraphQL::Mutation
2
+ class CompleteTask < GraphQL::Schema::Mutation
3
+ argument :task_id, Int
4
+ field :ok, Boolean
5
+ field :errors, [String]
6
+
7
+ def resolve(task_id:)
8
+ task = Twenty::Task.find(task_id)
9
+ task.update!(status: :complete)
10
+ {ok: true, errors: []}
11
+ rescue => ex
12
+ {ok: false, errors: [ex.message]}
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ module Twenty::GraphQL::Mutation
2
+ class CreateTask < GraphQL::Schema::Mutation
3
+ field :errors, [String], null: false
4
+ argument :input, Twenty::GraphQL::Input::TaskInput
5
+
6
+ def resolve(input:)
7
+ Twenty::Task.new(input.to_h).save!
8
+ {"errors" => []}
9
+ rescue => ex
10
+ {"errors" => [ex.message]}
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ module Twenty::GraphQL::Mutation
2
+ class DestroyTask < GraphQL::Schema::Mutation
3
+ argument :task_id, Int
4
+ field :ok, Boolean
5
+ field :errors, [String]
6
+
7
+ def resolve(task_id:)
8
+ task = Twenty::Task.find(task_id)
9
+ task.destroy!
10
+ {ok: true, errors: []}
11
+ rescue => ex
12
+ {ok: false, errors: [ex.message]}
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ module Twenty::GraphQL::Mutation
2
+ class SetRandomProjectColor < ::GraphQL::Schema::Mutation
3
+ require_relative "../type/project"
4
+ argument :project_id, Int, required: true
5
+
6
+ field :errors, [String], null: false
7
+ field :project, Twenty::GraphQL::Type::Project, null: true
8
+
9
+ def resolve(project_id:)
10
+ project = Twenty::Project.find(project_id)
11
+ project.update!(color: project.random_color)
12
+ {errors: [], project:}
13
+ rescue => ex
14
+ {errors: [ex.message]}
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ module Twenty::GraphQL::Mutation
2
+ class UpdateTask < GraphQL::Schema::Mutation
3
+ field :errors, [String], null: false
4
+ argument :task_id, Int
5
+ argument :input, Twenty::GraphQL::Input::TaskInput
6
+
7
+ def resolve(task_id:, input:)
8
+ task = Twenty::Task.find_by(id: task_id)
9
+ task.update!(input.to_h)
10
+ {"errors" => []}
11
+ rescue => ex
12
+ {"errors" => [ex.message]}
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ module Twenty::GraphQL
2
+ module Mutation
3
+ require_relative "mutation/destroy_task"
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ module Twenty::GraphQL
2
+ class Schema < GraphQL::Schema
3
+ query Type::Query
4
+ mutation Type::Mutation
5
+ end
6
+ end
@@ -0,0 +1,14 @@
1
+ module Twenty::GraphQL::Type
2
+ class Mutation < GraphQL::Schema::Object
3
+ require_relative "../mutation/destroy_task"
4
+ require_relative "../mutation/complete_task"
5
+ require_relative "../mutation/create_task"
6
+ require_relative "../mutation/update_task"
7
+ require_relative "../mutation/set_random_project_color"
8
+ field :destroy_task, mutation: Twenty::GraphQL::Mutation::DestroyTask
9
+ field :complete_task, mutation: Twenty::GraphQL::Mutation::CompleteTask
10
+ field :create_task, mutation: Twenty::GraphQL::Mutation::CreateTask
11
+ field :update_task, mutation: Twenty::GraphQL::Mutation::UpdateTask
12
+ field :set_random_project_color, mutation: Twenty::GraphQL::Mutation::SetRandomProjectColor
13
+ end
14
+ end
@@ -0,0 +1,10 @@
1
+ module Twenty::GraphQL::Type
2
+ class Project < GraphQL::Schema::Object
3
+ require_relative "task"
4
+ field :id, Int, null: false
5
+ field :name, String, null: false
6
+ field :path, String, null: false
7
+ field :color, String, null: false
8
+ field :tasks, [Task], null: false
9
+ end
10
+ end
@@ -0,0 +1,27 @@
1
+ module Twenty::GraphQL::Type
2
+ class Query < GraphQL::Schema::Object
3
+ field :find_task, Task, null: true do
4
+ argument :task_id, Int
5
+ end
6
+ field :tasks, [Task], null: false do
7
+ argument :status, TaskStatus
8
+ argument :project_id, Int, required: false
9
+ end
10
+ field :projects, [Project], null: false
11
+
12
+ def find_task(task_id:)
13
+ Twenty::Task.find_by(id: task_id)
14
+ end
15
+
16
+ def tasks(status:, project_id: nil)
17
+ tasks = Twenty::Task
18
+ .where(status:)
19
+ .order(updated_at: :desc)
20
+ project_id ? tasks.where(project_id:) : tasks
21
+ end
22
+
23
+ def projects
24
+ Twenty::Project.all
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ module Twenty::GraphQL::Type
2
+ class Task < GraphQL::Schema::Object
3
+ require_relative "project"
4
+ field :id, Int, null: false
5
+ field :title, String, null: false
6
+ field :status, TaskStatus, null: false
7
+ field :content, String, null: false
8
+ field :project, Project, null: false
9
+ field :updated_at, GraphQL::Types::ISO8601DateTime, null: false
10
+ field :is_ready, Boolean, null: false, method: :ready?
11
+ field :is_backlogged, Boolean, null: false, method: :backlog?
12
+ field :is_complete, Boolean, null: false, method: :complete?
13
+ field :in_progress, Boolean, null: false, method: :in_progress?
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ module Twenty::GraphQL::Type
2
+ class TaskStatus < GraphQL::Schema::Enum
3
+ value :backlog
4
+ value :ready
5
+ value :in_progress
6
+ value :complete
7
+ end
8
+ end
@@ -0,0 +1,10 @@
1
+ module Twenty::GraphQL
2
+ module Type
3
+ include ::GraphQL::Types
4
+ end
5
+ require_relative "type/task_status"
6
+ require_relative "type/project"
7
+ require_relative "type/task"
8
+ require_relative "type/query"
9
+ require_relative "type/mutation"
10
+ end
@@ -0,0 +1,7 @@
1
+ module Twenty::GraphQL
2
+ require "graphql"
3
+ require_relative "graphql/input"
4
+ require_relative "graphql/type"
5
+ require_relative "graphql/mutation"
6
+ require_relative "graphql/schema"
7
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateProjects < ActiveRecord::Migration[7.1]
4
+ def up
5
+ create_table(:projects) do |t|
6
+ t.string :name, null: false
7
+ t.string :path, null: false
8
+ t.timestamps
9
+ end
10
+ add_index :projects, [:name, :path], unique: true
11
+ end
12
+
13
+ def down
14
+ drop_table(:projects)
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateTasks < ActiveRecord::Migration[7.1]
4
+ def up
5
+ create_table(:tasks) do |t|
6
+ t.string :title, null: false
7
+ t.text :content, null: false
8
+ t.integer :status, null: false, default: 0
9
+ t.belongs_to :project, null: false
10
+ t.timestamps
11
+ end
12
+ end
13
+
14
+ def down
15
+ drop_table(:tasks)
16
+ end
17
+ end
@@ -0,0 +1,10 @@
1
+ class AddColorToProjects < ActiveRecord::Migration[7.1]
2
+ def up
3
+ default = Twenty::ColorableMixin.random_color
4
+ add_column :projects, :color, :string, null: false, default:
5
+ end
6
+
7
+ def down
8
+ drop_column :projects, :color
9
+ end
10
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::Migration
4
+ ##
5
+ # @return [String]
6
+ # Returns the path to twenty's migrations.
7
+ def self.migrations_path
8
+ [File.join(__dir__, "migration")]
9
+ end
10
+
11
+ ##
12
+ # Runs migrations (if neccessary).
13
+ # @return [void]
14
+ def self.run!
15
+ context.migrate
16
+ end
17
+ ActiveRecord.timestamped_migrations = false
18
+
19
+ ##
20
+ # @return [Boolean]
21
+ # Returns true when there are pending migrations.
22
+ def self.pending_migrations?
23
+ context.open.pending_migrations.any?
24
+ end
25
+
26
+ ##
27
+ # @return [ActiveRecord::MigrationContext]
28
+ # Returns an instance of
29
+ # {ActiveRecord::MigrationContext ActiveRecord::MigrationContext}.
30
+ def self.context
31
+ @context ||= ActiveRecord::MigrationContext.new(migrations_path)
32
+ end
33
+ private_class_method :context
34
+ end
@@ -0,0 +1,28 @@
1
+ module Twenty::ColorableMixin
2
+ extend self
3
+
4
+ COLORS = [
5
+ '#222222', '#333333', '#444444', '#555555', '#666666',
6
+ '#777777', '#888888', '#999999', '#AA2222', '#22AA22',
7
+ '#2222AA', '#AA22AA', '#CC9900', '#0099CC', '#9900CC',
8
+ '#FF9900', '#00CC99', '#99CC00', '#CC0099', '#990000',
9
+ '#112233', '#445566', '#778899', '#AA4455', '#5544AA',
10
+ '#88AA44', '#AA88AA', '#CCBB00', '#1155CC', '#9900BB',
11
+ '#DD6600', '#00BBCC', '#CC0099', '#BB3300', '#006688',
12
+ '#993366', '#2200AA', '#557788', '#998877', '#BB4400'
13
+ ]
14
+
15
+ def self.included(klass)
16
+ klass.before_validation :set_random_color, on: :create
17
+ end
18
+
19
+ def random_color
20
+ COLORS.sample
21
+ end
22
+
23
+ private
24
+
25
+ def set_random_color
26
+ self.color = random_color
27
+ end
28
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Twenty::Project < Twenty::Model
4
+ include Twenty::ColorableMixin
5
+ self.table_name = "projects"
6
+
7
+ ##
8
+ # Validations
9
+ validates :name, presence: true
10
+ validates :path, presence: true
11
+
12
+ ##
13
+ # Associations
14
+ has_many :tasks, class_name: "Twenty::Task"
15
+
16
+ ##
17
+ # @return [String]
18
+ # The path to a project.
19
+ def path
20
+ super&.sub(Dir.home, "~")
21
+ end
22
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Twenty::Task < Twenty::Model
4
+ self.table_name = "tasks"
5
+
6
+ STATUS = {backlog: 0, ready: 1, in_progress: 2, complete: 3}
7
+ enum :status, STATUS, default: :backlog
8
+
9
+ ##
10
+ # Validations
11
+ validates :title, presence: true
12
+ validates :content, presence: true
13
+ validates :project, presence: true
14
+
15
+ ##
16
+ # Associations
17
+ belongs_to :project, class_name: "Twenty::Project"
18
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Twenty::Model < ActiveRecord::Base
4
+ require_relative "model/mixin/colorable_mixin"
5
+ require_relative "model/project"
6
+ require_relative "model/task"
7
+ end
@@ -0,0 +1,15 @@
1
+ class Twenty::Servlet::GraphQL < Twenty::Servlet
2
+ ##
3
+ # POST /servlet/graphql/
4
+ def do_POST(req, res)
5
+ params = JSON.parse(req.body)
6
+ result = Twenty::GraphQL::Schema.execute(
7
+ params['query'],
8
+ variables: params['variables'],
9
+ context: {}
10
+ )
11
+ res['content_type'] = 'application/json'
12
+ res.status = 200
13
+ res.body = result.to_json
14
+ end
15
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::Servlet::ServerMixin
4
+ ##
5
+ # @param [Hash] options
6
+ # Server options that take precedence over
7
+ # {ServerMixin#server_options ServerMixin#server_options}.
8
+ #
9
+ # @return [WEBrick::HTTPServer]
10
+ # Returns an instance of WEBrick::HTTPServer.
11
+ def server(options = {})
12
+ server = WEBrick::HTTPServer.new server_options.merge(options)
13
+ server.mount "/graphql", Twenty::Servlet::GraphQL
14
+ server
15
+ end
16
+
17
+ ##
18
+ # @return [Hash<Symbol, String>]
19
+ # The default server options given to WEBrick::HTTPServer.new.
20
+ def server_options
21
+ {
22
+ DocumentRoot: Twenty.build,
23
+ BindAddress: "127.0.0.1",
24
+ Port: 2020
25
+ }
26
+ end
27
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Twenty::Servlet < WEBrick::HTTPServlet::AbstractServlet
4
+ ##
5
+ # servlets
6
+ require_relative "servlet/graphql"
7
+
8
+ ##
9
+ # mixins
10
+ require_relative "servlet/mixin/server_mixin"
11
+ extend ServerMixin
12
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty
4
+ require "fileutils"
5
+ require "webrick"
6
+ require "active_record"
7
+ require_relative "twenty-backend/graphql"
8
+ require_relative "twenty-backend/servlet"
9
+ require_relative "twenty-backend/migration"
10
+ require_relative "twenty-backend/model"
11
+ extend FileUtils
12
+
13
+ ##
14
+ # @return [String]
15
+ # Returns the directory where twenty stores data.
16
+ def self.data_dir
17
+ File.join(Dir.home, ".local", "share", "20")
18
+ end
19
+
20
+ ##
21
+ # @return [String]
22
+ # Returns the location of the default SQLite database.
23
+ def self.default_database
24
+ @default_database ||= File.join(data_dir, "database.sqlite")
25
+ end
26
+
27
+ ##
28
+ # Establishes a database connection.
29
+ #
30
+ # @param [String] path
31
+ # The path to a SQLite3 database file.
32
+ #
33
+ # @return [void]
34
+ def self.establish_connection(path:)
35
+ ActiveRecord::Base.establish_connection(
36
+ adapter: "sqlite3",
37
+ database: path,
38
+ pool: 16
39
+ )
40
+ end
41
+
42
+ ##
43
+ # Prepares the parent directory of the database.
44
+ # @return [void]
45
+ # @api private
46
+ def self.prepare_dir
47
+ return if File.exist?(default_database)
48
+ mkdir_p(data_dir)
49
+ touch(default_database)
50
+ rescue => ex
51
+ warn "prepare_dir error: #{ex.message} (#{ex.class})"
52
+ end
53
+ private_class_method :prepare_dir
54
+ prepare_dir
55
+ 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 CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twenty-backend
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - '0x1eef'
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-08 00:00:00.000000000 Z
11
+ date: 2024-02-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -94,27 +94,42 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '1.13'
97
- - !ruby/object:Gem::Dependency
98
- name: rake
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: '13.1'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: '13.1'
111
97
  description: 'twenty: backend'
112
98
  email:
113
99
  - 0x1eef@protonmail.com
114
100
  executables: []
115
101
  extensions: []
116
102
  extra_rdoc_files: []
117
- files: []
103
+ files:
104
+ - "./lib/twenty-backend.rb"
105
+ - "./lib/twenty-backend/graphql.rb"
106
+ - "./lib/twenty-backend/graphql/input.rb"
107
+ - "./lib/twenty-backend/graphql/input/task_input.rb"
108
+ - "./lib/twenty-backend/graphql/mutation.rb"
109
+ - "./lib/twenty-backend/graphql/mutation/complete_task.rb"
110
+ - "./lib/twenty-backend/graphql/mutation/create_task.rb"
111
+ - "./lib/twenty-backend/graphql/mutation/destroy_task.rb"
112
+ - "./lib/twenty-backend/graphql/mutation/set_random_project_color.rb"
113
+ - "./lib/twenty-backend/graphql/mutation/update_task.rb"
114
+ - "./lib/twenty-backend/graphql/schema.rb"
115
+ - "./lib/twenty-backend/graphql/type.rb"
116
+ - "./lib/twenty-backend/graphql/type/mutation.rb"
117
+ - "./lib/twenty-backend/graphql/type/project.rb"
118
+ - "./lib/twenty-backend/graphql/type/query.rb"
119
+ - "./lib/twenty-backend/graphql/type/task.rb"
120
+ - "./lib/twenty-backend/graphql/type/task_status.rb"
121
+ - "./lib/twenty-backend/migration.rb"
122
+ - "./lib/twenty-backend/migration/1_create_projects.rb"
123
+ - "./lib/twenty-backend/migration/2_create_tasks.rb"
124
+ - "./lib/twenty-backend/migration/3_add_color_to_projects.rb"
125
+ - "./lib/twenty-backend/model.rb"
126
+ - "./lib/twenty-backend/model/mixin/colorable_mixin.rb"
127
+ - "./lib/twenty-backend/model/project.rb"
128
+ - "./lib/twenty-backend/model/task.rb"
129
+ - "./lib/twenty-backend/servlet.rb"
130
+ - "./lib/twenty-backend/servlet/graphql.rb"
131
+ - "./lib/twenty-backend/servlet/mixin/server_mixin.rb"
132
+ - "./share/twenty-backend/schema.graphql"
118
133
  homepage: https://github.com/0x1eef/twenty#readme
119
134
  licenses:
120
135
  - 0BSD