diff --git a/README.md b/README.md
index a24aaa9..882c1e6 100644
--- a/README.md
+++ b/README.md
@@ -39,6 +39,11 @@ List all courses
moodle.courses.index
```
+Search for a course by name
+```
+moodle.courses.search('My course')
+```
+
Show a course
```
moodle.courses.show(course_id)
diff --git a/lib/moodle_rb/courses.rb b/lib/moodle_rb/courses.rb
index aca12fb..8f79533 100644
--- a/lib/moodle_rb/courses.rb
+++ b/lib/moodle_rb/courses.rb
@@ -22,6 +22,21 @@ def index
response.parsed_response
end
+ # Search courses by (name, module, block, tag)
+ def search(criteria_value, criteria_name = 'search')
+ response = self.class.get(
+ '/webservice/rest/server.php',
+ {
+ :query => query_hash('core_course_search_courses', token).merge({
+ :criterianame => criteria_name,
+ :criteriavalue => criteria_value
+ })
+ }.merge(query_options)
+ )
+ check_for_errors(response)
+ response.parsed_response
+ end
+
# required params:
# full_name
# short_name
diff --git a/lib/moodle_rb/version.rb b/lib/moodle_rb/version.rb
index 31a7026..6f3ea83 100644
--- a/lib/moodle_rb/version.rb
+++ b/lib/moodle_rb/version.rb
@@ -1,5 +1,5 @@
module MoodleRb
- VERSION = '2.0.0' unless defined?(self::VERSION)
+ VERSION = '2.1.0' unless defined?(self::VERSION)
def self.version
VERSION
diff --git a/spec/cassettes/MoodleRb_Courses/_search/.yml b/spec/cassettes/MoodleRb_Courses/_search/.yml
new file mode 100644
index 0000000..571a9c6
--- /dev/null
+++ b/spec/cassettes/MoodleRb_Courses/_search/.yml
@@ -0,0 +1,102 @@
+---
+http_interactions:
+- request:
+ method: get
+ uri: http://localhost:8888/moodle28/webservice/rest/server.php?criterianame=search&criteriavalue=My%20course&moodlewsrestformat=json&wsfunction=core_course_search_courses&wstoken=60fc9c9415259404795094957e4ab32f
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Accept-Ranges:
+ - bytes
+ Access-Control-Allow-Origin:
+ - "*"
+ Age:
+ - '0'
+ Cache-Control:
+ - private, must-revalidate, pre-check=0, post-check=0, max-age=0
+ Content-Type:
+ - application/json
+ Date:
+ - Wed, 11 May 2022 03:43:20 GMT
+ Expires:
+ - Thu, 01 Jan 1970 00:00:00 GMT
+ Pragma:
+ - no-cache
+ Server:
+ - Moodle
+ X-Cache:
+ - MISS
+ X-Clacks-Overhead:
+ - GNU Terry Pratchett
+ X-Powered-By:
+ - Moodle Ninjas
+ Content-Length:
+ - '3946'
+ Connection:
+ - keep-alive
+ body:
+ encoding: UTF-8
+ string: '{"total":1,"courses":[{"id":316,"fullname":"My large course","displayname":"My
+ large course","shortname":"MLC","categoryid":8,"categoryname":"VETtrak testing","sortorder":50002,"summary":"Test
+ course 1
\nLorem ipsum dolor sit amet, consectetuer adipiscing elit.
+ Nulla non arcu lacinia neque faucibus fringilla. Vivamus porttitor turpis
+ ac leo. Integer in sapien. Nullam eget nisl. Aliquam erat volutpat. Cras elementum.
+ Mauris suscipit, ligula sit amet pharetra semper, nibh ante cursus purus,
+ vel sagittis velit mauris vel metus. Integer malesuada. Nullam lectus justo,
+ vulputate eget mollis sed, tempor sed magna. Mauris elementum mauris vitae
+ tortor. Aliquam erat volutpat.
\nTemporibus autem quibusdam et aut officiis
+ debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae
+ sint et molestiae non recusandae. Pellentesque ipsum. Cras pede libero, dapibus
+ nec, pretium sit amet, tempor quis. Aliquam ante. Proin in tellus sit amet
+ nibh dignissim sagittis. Vivamus porttitor turpis ac leo. Duis bibendum, lectus
+ ut viverra rhoncus, dolor nunc faucibus libero, eget facilisis enim ipsum
+ id lacus. In sem justo, commodo ut, suscipit at, pharetra vitae, orci. Aliquam
+ erat volutpat. Nulla est.
\nVivamus luctus egestas leo. Aenean fermentum
+ risus id tortor. Mauris dictum facilisis augue. Aliquam erat volutpat. Aliquam
+ ornare wisi eu metus. Aliquam id dolor. Duis condimentum augue id magna semper
+ rutrum. Donec iaculis gravida nulla. Pellentesque ipsum. Etiam dictum tincidunt
+ diam. Quisque tincidunt scelerisque libero. Etiam egestas wisi a erat.
\nInteger lacinia. Cum sociis natoque penatibus et magnis dis parturient
+ montes, nascetur ridiculus mus. Mauris tincidunt sem sed arcu. Nullam feugiat,
+ turpis at pulvinar vulputate, erat libero tristique tellus, nec bibendum odio
+ risus sit amet ante. Aliquam id dolor. Maecenas sollicitudin. Et harum quidem
+ rerum facilis est et expedita distinctio. Mauris suscipit, ligula sit amet
+ pharetra semper, nibh ante cursus purus, vel sagittis velit mauris vel metus.
+ Nullam dapibus fermentum ipsum. Pellentesque habitant morbi tristique senectus
+ et netus et malesuada fames ac turpis egestas. Nemo enim ipsam voluptatem
+ quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni
+ dolores eos qui ratione voluptatem sequi nesciunt. Pellentesque sapien. Duis
+ risus. Mauris elementum mauris vitae tortor. Suspendisse nisl. Integer rutrum,
+ orci vestibulum ullamcorper ultricies, lacus quam ultricies odio, vitae placerat
+ pede sem sit amet enim.
\nIn laoreet, magna id viverra tincidunt, sem
+ odio bibendum justo, vel imperdiet sapien wisi sed libero. Proin pede metus,
+ vulputate nec, fermentum fringilla, vehicula vitae, justo. Nullam justo enim,
+ consectetuer nec, ullamcorper ac, vestibulum in, elit. Quis autem vel eum
+ iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur,
+ vel illum qui dolorem eum fugiat quo voluptas nulla pariatur? Maecenas lorem.
+ Etiam posuere lacus quis dolor. Class aptent taciti sociosqu ad litora torquent
+ per conubia nostra, per inceptos hymenaeos. Curabitur ligula sapien, pulvinar
+ a vestibulum quis, facilisis vel sapien. Nam sed tellus id magna elementum
+ tincidunt. Suspendisse nisl. Vivamus luctus egestas leo. Nulla non arcu lacinia
+ neque faucibus fringilla. Etiam dui sem, fermentum vitae, sagittis id, malesuada
+ in, quam. Etiam dictum tincidunt diam. Etiam commodo dui eget wisi. Nemo enim
+ ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia
+ consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Proin
+ pede metus, vulputate nec, fermentum fringilla, vehicula vitae, justo. Duis
+ ante orci, molestie vitae vehicula venenatis, tincidunt ac pede. Pellentesque
+ sapien.","summaryformat":1,"summaryfiles":[],"overviewfiles":[],"showactivitydates":true,"showcompletionconditions":true,"contacts":[],"enrollmentmethods":["manual"]}],"warnings":[]}'
+ http_version:
+ recorded_at: Wed, 11 May 2022 03:42:46 GMT
+recorded_with: VCR 2.9.3
diff --git a/spec/cassettes/MoodleRb_Courses/_search/when_using_invalid_token/.yml b/spec/cassettes/MoodleRb_Courses/_search/when_using_invalid_token/.yml
new file mode 100644
index 0000000..876ea9b
--- /dev/null
+++ b/spec/cassettes/MoodleRb_Courses/_search/when_using_invalid_token/.yml
@@ -0,0 +1,55 @@
+---
+http_interactions:
+- request:
+ method: get
+ uri: http://localhost:8888/moodle28/webservice/rest/server.php?criterianame=search&criteriavalue=My%20course&moodlewsrestformat=json&wsfunction=core_course_search_courses&wstoken=
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Accept-Ranges:
+ - bytes
+ Access-Control-Allow-Origin:
+ - "*"
+ Age:
+ - '0'
+ Cache-Control:
+ - private, must-revalidate, pre-check=0, post-check=0, max-age=0
+ Content-Type:
+ - application/json
+ Date:
+ - Wed, 11 May 2022 03:43:20 GMT
+ Expires:
+ - Thu, 01 Jan 1970 00:00:00 GMT
+ Pragma:
+ - no-cache
+ Server:
+ - Moodle
+ X-Cache:
+ - MISS
+ X-Clacks-Overhead:
+ - GNU Terry Pratchett
+ X-Powered-By:
+ - Moodle Ninjas
+ Content-Length:
+ - '103'
+ Connection:
+ - keep-alive
+ body:
+ encoding: UTF-8
+ string: '{"exception":"moodle_exception","errorcode":"invalidtoken","message":"Invalid
+ token - token not found"}'
+ http_version:
+ recorded_at: Wed, 11 May 2022 03:42:46 GMT
+recorded_with: VCR 2.9.3
diff --git a/spec/lib/moodle_rb/courses_spec.rb b/spec/lib/moodle_rb/courses_spec.rb
index de75492..e254205 100644
--- a/spec/lib/moodle_rb/courses_spec.rb
+++ b/spec/lib/moodle_rb/courses_spec.rb
@@ -36,6 +36,27 @@
end
end
+ describe '#search', :vcr => {
+ :match_requests_on => [:body, :path], :record => :once
+ } do
+ let(:result) { course_moodle_rb.search('My course') }
+
+ specify do
+ expect(result["total"]).to eq 1
+ expect(result["courses"]).to be_a Array
+ end
+
+ context 'when using invalid token' do
+ let(:token) { '' }
+ specify do
+ expect{ course_moodle_rb.search('My course') }.to raise_error(
+ MoodleRb::MoodleError,
+ 'Invalid token - token not found'
+ )
+ end
+ end
+ end
+
describe '#create', :vcr => {
:match_requests_on => [:path], :record => :once
} do