Skip to content

Develop task #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@ GEM

PLATFORMS
arm64-darwin-22
ruby

DEPENDENCIES
byebug
Expand Down
9 changes: 9 additions & 0 deletions app/graphql/interfaces/collection_queries.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# frozen_string_literal: true

module Interfaces
module CollectionQueries
include Types::BaseInterface

field :collections, resolver: Queries::Collections
end
end
9 changes: 9 additions & 0 deletions app/graphql/interfaces/course_mutations.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# frozen_string_literal: true

module Interfaces
module CourseMutations
include Types::BaseInterface

field :create_course, mutation: Mutations::CreateCourse
end
end
9 changes: 9 additions & 0 deletions app/graphql/interfaces/course_queries.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# frozen_string_literal: true

module Interfaces
module CourseQueries
include Types::BaseInterface

field :courses, resolver: Queries::Courses
end
end
16 changes: 16 additions & 0 deletions app/graphql/mutations/create_course.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# frozen_string_literal: true

module Mutations
class CreateCourse < BaseMutation
argument :title, String, required: true
argument :description, String, required: false
argument :published, Boolean, required: true
argument :collections, [ID], required: false

type Types::CourseType, null: false

def resolve(arguments = {})
Courses::CreateCourseService.new(arguments).call
end
end
end
11 changes: 11 additions & 0 deletions app/graphql/queries/collections.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# frozen_string_literal: true

module Queries
class Collections < GraphQL::Schema::Resolver
type [Types::CollectionType], null: false

def resolve
::Collections::CollectionsQueryService.new.call
end
end
end
13 changes: 13 additions & 0 deletions app/graphql/queries/courses.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# frozen_string_literal: true

module Queries
class Courses < GraphQL::Schema::Resolver
type [Types::CourseType], null: false

argument :filters, Types::Inputs::CourseFilters, required: false

def resolve(filters: {})
::Courses::CoursesQueryService.new(filters: filters).call
end
end
end
14 changes: 14 additions & 0 deletions app/graphql/types/collection_type.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# frozen_string_literal: true

module Types
class CollectionType < Types::BaseObject
field :id, ID, null: false
field :title, String, null: false
field :description, String
field :image_path, String
field :published, Boolean, null: false
field :created_at, GraphQL::Types::ISO8601DateTime, null: false
field :updated_at, GraphQL::Types::ISO8601DateTime, null: false
field :courses, [Types::CourseType]
end
end
5 changes: 5 additions & 0 deletions app/graphql/types/course_type.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,10 @@ class CourseType < Types::BaseObject
field :published, Boolean, null: false
field :created_at, GraphQL::Types::ISO8601DateTime, null: false
field :updated_at, GraphQL::Types::ISO8601DateTime, null: false
field :discount, Integer, null: false

def discount
object.collections&.map(&:discount)&.map {|discount| discount&.amount.to_i }.max.to_i
end
end
end
9 changes: 9 additions & 0 deletions app/graphql/types/inputs/course_filters.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# frozen_string_literal: true

module Types
module Inputs
class CourseFilters < Types::BaseInputObject
argument :published, Boolean, required: false
end
end
end
2 changes: 2 additions & 0 deletions app/graphql/types/mutation_type.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,7 @@ class MutationType < Types::BaseObject
def test_field
"Hello World"
end

implements Interfaces::CourseMutations
end
end
12 changes: 9 additions & 3 deletions app/graphql/types/query_type.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,16 @@ def nodes(ids:)
ids.map { |id| context.schema.object_from_id(id, context) }
end

field :courses, [Types::CourseType], null: false, description: "Returns a list of courses"
field :includes, Boolean, null: true, description: "Returns is the course belongs to collection" do
argument :collection, ID, required: true
argument :course, ID, required: true
end

def courses
Course.all
def includes(collection:, course:)
Collection.find(collection).courses.exists?(id: course)
end

implements Interfaces::CourseQueries
implements Interfaces::CollectionQueries
end
end
19 changes: 19 additions & 0 deletions app/services/collections/collections_query_service.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# frozen_string_literal: true

module Collections
class CollectionsQueryService
def call
collections
end

private

def base_scope
Collection.all
end

def collections
base_scope
end
end
end
27 changes: 27 additions & 0 deletions app/services/courses/courses_query_service.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# frozen_string_literal: true

module Courses
class CoursesQueryService
attr_reader :filters

def initialize(filters:)
@filters = filters
end

def call
courses
end

private

def base_scope
Course.all
end

def courses
courses = base_scope
courses = courses.where(published: filters[:published]) if filters.key?(:published)
courses
end
end
end
19 changes: 19 additions & 0 deletions app/services/courses/create_course_service.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# frozen_string_literal: true

module Courses
class CreateCourseService
def initialize(arguments)
@title = arguments[:title]
@description = arguments[:description]
@published = arguments[:published]
@collections = arguments[:collections]
end

def call
course = Course.new(title: @title, description: @description, published: @published)
course.collections << Collection.where(id: @collections) if @collections
course.save!
course
end
end
end