Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
960bb13
Initial setup for I18n
ishani-rajput Mar 6, 2025
20951a4
Assignments I18n
ishani-rajput Mar 6, 2025
fc5e380
Locales updated
ishani-rajput Mar 6, 2025
5ab29c4
Merge pull request #1 from ishani-rajput/feature-assignments
ishani-rajput Mar 6, 2025
2b208ba
Courses component I18n
ishani-rajput Mar 6, 2025
7e60759
Merge pull request #2 from ishani-rajput/feature-courses
ishani-rajput Mar 6, 2025
71c9fc6
Institutions I18n
ishani-rajput Mar 6, 2025
15b8ee4
Merge main into feature-institutions
ishani-rajput Mar 6, 2025
bfe74cd
Merge pull request #3 from ishani-rajput/feature-institutions
ishani-rajput Mar 6, 2025
f863e86
Roles I18n
ishani-rajput Mar 6, 2025
be17deb
Merge pull request #4 from ishani-rajput/feature-roles
ishani-rajput Mar 6, 2025
101d8e7
Locales updated for Participants
ishani-rajput Mar 6, 2025
35c115f
Participants I18n
ishani-rajput Mar 6, 2025
bd35508
Merge pull request #5 from ishani-rajput/feature-participants
ishani-rajput Mar 6, 2025
6e3ab4d
Locales updated for users
ishani-rajput Mar 6, 2025
5aa5dfb
Users I18n
ishani-rajput Mar 6, 2025
fa3d4e9
Merge pull request #6 from ishani-rajput/feature-users
ishani-rajput Mar 6, 2025
ef671e3
Added RSpec tests for users_controller
elnaz-72 Mar 10, 2025
6d81b72
Bookmarks I18n
ishani-rajput Mar 13, 2025
6fac9df
Join_team_requests I18n
ishani-rajput Mar 13, 2025
74de5b8
Signed_up_teams I18n
ishani-rajput Mar 13, 2025
5ce4914
accounts_requests I18n
ishani-rajput Mar 13, 2025
1a9342d
sign_up_topics I18n
ishani-rajput Mar 13, 2025
6fb3f6c
Merge pull request #7 from ishani-rajput/bookmarks-teams
ishani-rajput Mar 13, 2025
573b877
Update users_controller_spec.rb
elnaz-72 Mar 16, 2025
4994f3b
Add workflow for RSpec testing
elnaz-72 Mar 16, 2025
4fcb8a3
Update rubyonrails.yml
elnaz-72 Mar 16, 2025
9d8f4a6
Update rubyonrails.yml
elnaz-72 Mar 16, 2025
7a74779
Update rubyonrails.yml
elnaz-72 Mar 16, 2025
988b37b
Update rubyonrails.yml
elnaz-72 Mar 16, 2025
ff5e588
Update rubyonrails.yml
elnaz-72 Mar 17, 2025
184ac97
Update rubyonrails.yml
elnaz-72 Mar 17, 2025
410830e
Update rubyonrails.yml
elnaz-72 Mar 17, 2025
198dcb0
Update rubyonrails.yml
elnaz-72 Mar 17, 2025
c6d8fe5
Update rubyonrails.yml
elnaz-72 Mar 17, 2025
b52ae10
Update rubyonrails.yml
elnaz-72 Mar 17, 2025
9ac54d5
Update rubyonrails.yml
elnaz-72 Mar 17, 2025
d0a21c8
Update rubyonrails.yml
elnaz-72 Mar 17, 2025
33ab718
Update rubyonrails.yml
elnaz-72 Mar 17, 2025
b5241de
Adding RSpec tests for institutions_controller.rb via institutions_co…
Mar 20, 2025
34d5be1
Adding RSpec tests for participants_controller.rb via participants_co…
Mar 20, 2025
ab428ef
Adding RSpec tests for roles_controller.rb via roles_controller_spec.rb
Mar 20, 2025
cd2935e
Add authentication bypass in UsersController RSpec tests
elnaz-72 Mar 20, 2025
48ac1f4
Update users_controller_spec.rb
elnaz-72 Mar 20, 2025
fcf4528
Update users_controller_spec.rb
elnaz-72 Mar 20, 2025
92942b7
Create course
elnaz-72 Mar 20, 2025
77ecebb
Rename course to course_controller_spec.rb
elnaz-72 Mar 20, 2025
a8eecae
Update assignments_controller_spec.rb
elnaz-72 Mar 20, 2025
1181ff8
Rename assignments_controller_spec.rb to assignments_spec.rb
elnaz-72 Mar 20, 2025
fa45242
Update assignments_spec.rb
elnaz-72 Mar 20, 2025
3f438fe
Update assignments_spec.rb
elnaz-72 Mar 20, 2025
0c467a0
Update assignments_spec.rb
elnaz-72 Mar 20, 2025
2beb843
Update assignments_spec.rb
elnaz-72 Mar 20, 2025
a830649
Update assignments_spec.rb
elnaz-72 Mar 20, 2025
f1ca96b
Update rubyonrails.yml
elnaz-72 Mar 21, 2025
cde5680
Update rubyonrails.yml
elnaz-72 Mar 21, 2025
6639dc9
Update rubyonrails.yml
elnaz-72 Mar 21, 2025
7ae6ef4
Update rubyonrails.yml
elnaz-72 Mar 21, 2025
9411886
Update rubyonrails.yml
elnaz-72 Mar 21, 2025
c9941b8
Update rubyonrails.yml
elnaz-72 Mar 21, 2025
80eb948
Update course_controller_spec.rb
elnaz-72 Mar 21, 2025
454dc60
Update rubyonrails.yml
elnaz-72 Mar 21, 2025
f280b2d
Adding MySQL wait check to institutions_controller_spec.rb
Mar 21, 2025
c88bede
Adding MySQL wait check to participants_controller_spec.rb
Mar 21, 2025
b5885ca
Adding MySQL wait check to roles_controller_spec.rb
Mar 21, 2025
eedfaed
Update rubyonrails.yml
elnaz-72 Mar 21, 2025
f07950c
Update rubyonrails.yml
elnaz-72 Mar 21, 2025
b61db3a
Update rubyonrails.yml
elnaz-72 Mar 21, 2025
61665f0
Update rubyonrails.yml
elnaz-72 Mar 21, 2025
dd3fe05
Update rubyonrails.yml
elnaz-72 Mar 21, 2025
54e792b
Update rubyonrails.yml
elnaz-72 Mar 21, 2025
4d3e149
Update rubyonrails.yml
elnaz-72 Mar 21, 2025
3077144
Update rubyonrails.yml
elnaz-72 Mar 21, 2025
15c096c
Update rubyonrails.yml
elnaz-72 Mar 21, 2025
a7dbe58
Update assignments_spec.rb
elnaz-72 Mar 21, 2025
351f1d4
Update assignments_spec.rb
elnaz-72 Mar 21, 2025
edc8f09
Update assignments_spec.rb
elnaz-72 Mar 21, 2025
778dc01
Update assignments_spec.rb
elnaz-72 Mar 21, 2025
a0a00d2
Create assignments_controller_
elnaz-72 Mar 21, 2025
d6c4a22
Rename assignments_controller_ to assignments_controller_spec.rb
elnaz-72 Mar 21, 2025
6a21c52
Update assignments_controller_spec.rb
elnaz-72 Mar 21, 2025
7b03600
Update assignments_controller_spec.rb
elnaz-72 Mar 21, 2025
6f502ce
Update assignments_controller_spec.rb
elnaz-72 Mar 21, 2025
8a0746d
Delete spec/controllers/api/v1/assignments_controller_spec.rb
elnaz-72 Mar 22, 2025
e36dad5
Update rubyonrails.yml
elnaz-72 Mar 22, 2025
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
122 changes: 122 additions & 0 deletions .github/workflows/rubyonrails.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
# This workflow uses actions that are not certified by GitHub. They are
# provided by a third-party and are governed by separate terms of service,
# privacy policy, and support documentation.
#
# This workflow will install a prebuilt Ruby version, install dependencies, and
# run tests and linters.
name: CI/CD

on:
push:
branches: [ main ]
pull_request:
branches: [ main ]

jobs:
test:
runs-on: ubuntu-latest

env:
DATABASE_URL: mysql2://root:[email protected]:3306/expertiza_test
RAILS_ENV: test

services:
mysql:
image: mysql:8.0
env:
MYSQL_ROOT_PASSWORD: expertiza
MYSQL_DATABASE: expertiza_test
ports:
- 3306:3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3

steps:
- uses: actions/checkout@v3

- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: 3.2.7
bundler-cache: true

- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18.x'

- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y netcat-traditional

- name: Install Ruby dependencies
run: |
gem update --system
gem install bundler:2.4.7
bundle install

- name: Setup database
run: |
bundle exec rails db:create RAILS_ENV=test
bundle exec rails db:schema:load RAILS_ENV=test

- name: Set up code climate test-reporter
run: |
curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
chmod +x ./cc-test-reporter
./cc-test-reporter before-build

- name: Run model tests
run: bundle exec rspec spec/models

- name: Run controller tests
run: bundle exec rspec spec/requests/

- name: Format code coverage report
run: ./cc-test-reporter format-coverage -t simplecov -o "coverage/codeclimate.models.json" --debug

- name: Upload coverage artifacts
uses: actions/upload-artifact@v4
with:
name: code-coverage-artifacts
path: coverage/


publish_code_coverage:
needs: test # Ensures this job runs after the test job
runs-on: ubuntu-latest
if: github.event_name == 'push' && github.ref == 'refs/heads/main' # Only run when there's a push to main branch

steps:
- uses: actions/checkout@v3
- uses: actions/download-artifact@v4
with:
name: code-coverage-artifacts
path: coverage/

- name: Upload code-coverage report to code-climate
run: |
export GIT_BRANCH="${GITHUB_REF/refs\/heads\//}"
curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
chmod +x ./cc-test-reporter
./cc-test-reporter sum-coverage coverage/codeclimate.*.json
./cc-test-reporter after-build -t simplecov -r ${{ secrets.CC_TEST_REPORTER_ID }}

docker:
needs: test
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2

- name: Build Docker image
uses: docker/build-push-action@v4
with:
context: .
push: false
tags: expertiza-backend:latest

10 changes: 5 additions & 5 deletions app/controllers/api/v1/account_requests_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def create
if @account_request.save
response = { account_request: @account_request }
if User.find_by(email: @account_request.email)
response[:warnings] = 'WARNING: User with this email already exists!'
response[:warnings] = I18n.t('account_requests.user_exists_warning')
end
render json: response, status: :created
else
Expand Down Expand Up @@ -60,7 +60,7 @@ def update
def destroy
@account_request = AccountRequest.find(params[:id])
@account_request.destroy
render json: { message: 'Account Request deleted' }, status: :no_content
render json: { message: I18n.t('account_requests.delete_success') }, status: :no_content
rescue ActiveRecord::RecordNotFound => e
render json: { error: e.message }, status: :not_found
end
Expand All @@ -74,20 +74,20 @@ def account_request_params
params[:account_request][:status] = 'Under Review'
# For Approval or Rejection of an existing request, raise error if user sends a status other than Approved or Rejected
elsif !['Approved', 'Rejected'].include?(params[:account_request][:status])
raise StandardError, 'Status can only be Approved or Rejected'
raise StandardError, I18n.t('account_requests.status_error')
end
params.require(:account_request).permit(:username, :full_name, :email, :status, :introduction, :role_id, :institution_id)
end

# Create a new user if account request is approved
def create_approved_user
if User.exists?(email: @account_request.email)
render json: { error: 'A user with this email already exists. Cannot approve the account request.' }, status: :unprocessable_entity
render json: { error: I18n.t('account_requests.user_exists') }, status: :unprocessable_entity
return
end
@new_user = User.new(name: @account_request.username, role_id: @account_request.role_id, institution_id: @account_request.institution_id, full_name: @account_request.full_name, email: @account_request.email, password: 'password')
if @new_user.save
render json: { success: 'Account Request Approved and User successfully created.', user: @new_user}, status: :ok
render json: { success: I18n.t('account_requests.create_success'), user: @new_user }, status: :ok
else
render json: @new_user.errors, status: :unprocessable_entity
end
Expand Down
34 changes: 17 additions & 17 deletions app/controllers/api/v1/assignments_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,28 +34,28 @@ def update
end

def not_found
render json: { error: "Assignment not found" }, status: :not_found
render json: { error: I18n.t('assignment.not_found') }, status: :not_found
end

# DELETE /api/v1/assignments/:id
def destroy
assignment = Assignment.find_by(id: params[:id])
if assignment
if assignment.destroy
render json: { message: "Assignment deleted successfully!" }, status: :ok
render json: { message: I18n.t('assignment.deleted_successfully') }, status: :ok
else
render json: { error: "Failed to delete assignment", details: assignment.errors.full_messages }, status: :unprocessable_entity
render json: { error: I18n.t('assignment.failed_to_delete'), details: assignment.errors.full_messages }, status: :unprocessable_entity
end
else
render json: { error: "Assignment not found" }, status: :not_found
render json: { error: I18n.t('assignment.not_found') }, status: :not_found
end
end

#add participant to assignment
def add_participant
assignment = Assignment.find_by(id: params[:assignment_id])
if assignment.nil?
render json: { error: "Assignment not found" }, status: :not_found
render json: { error: I18n.t('assignment.not_found') }, status: :not_found
else
new_participant = assignment.add_participant(params[:user_id])
if new_participant.save
Expand All @@ -73,12 +73,12 @@ def remove_participant
if user && assignment
assignment.remove_participant(user.id)
if assignment.save
render json: { message: "Participant removed successfully!" }, status: :ok
render json: { message: I18n.t('assignment.participant_removed') }, status: :ok
else
render json: assignment.errors, status: :unprocessable_entity
end
else
not_found_message = user ? "Assignment not found" : "User not found"
not_found_message = user ? I18n.t('assignment.user_not_found') : I18n.t('assignment.not_found')
render json: { error: not_found_message }, status: :not_found
end
end
Expand All @@ -88,7 +88,7 @@ def remove_participant
def remove_assignment_from_course
assignment = Assignment.find(params[:assignment_id])
if assignment.nil?
render json: { error: "Assignment not found" }, status: :not_found
render json: { error: I18n.t('assignment.not_found') }, status: :not_found
else
assignment = assignment.remove_assignment_from_course
if assignment.save
Expand All @@ -112,7 +112,7 @@ def assign_course
render json: assignment.errors, status: :unprocessable_entity
end
else
not_found_message = course ? "Assignment not found" : "Course not found"
not_found_message = course ? I18n.t('assignment.course_not_found') : I18n.t('assignment.not_found')
render json: { error: not_found_message }, status: :not_found
end
end
Expand All @@ -121,7 +121,7 @@ def assign_course
def copy_assignment
assignment = Assignment.find_by(id: params[:assignment_id])
if assignment.nil?
render json: { error: "Assignment not found" }, status: :not_found
render json: { error: I18n.t('assignment.not_found') }, status: :not_found
else
new_assignment = assignment.copy
if new_assignment.save
Expand All @@ -137,7 +137,7 @@ def copy_assignment
def show_assignment_details
assignment = Assignment.find_by(id: params[:assignment_id])
if assignment.nil?
render json: { error: "Assignment not found" }, status: :not_found
render json: { error: I18n.t('assignment.not_found') }, status: :not_found
else
render json: {
id: assignment.id,
Expand All @@ -155,7 +155,7 @@ def show_assignment_details
def has_topics
assignment = Assignment.find_by(id: params[:assignment_id])
if assignment.nil?
render json: { error: "Assignment not found" }, status: :not_found
render json: { error: I18n.t('assignment.not_found') }, status: :not_found
else
render json: assignment.topics?, status: :ok
end
Expand All @@ -166,7 +166,7 @@ def has_topics
def team_assignment
assignment = Assignment.find_by(id: params[:assignment_id])
if assignment.nil?
render json: { error: "Assignment not found" }, status: :not_found
render json: { error: I18n.t('assignment.not_found') }, status: :not_found
else
render json: assignment.team_assignment?, status: :ok
end
Expand All @@ -178,7 +178,7 @@ def valid_num_review
assignment = Assignment.find_by(id: params[:assignment_id])
review_type = params[:review_type]
if assignment.nil?
render json: { error: "Assignment not found" }, status: :not_found
render json: { error: I18n.t('assignment.not_found') }, status: :not_found
else
render json: assignment.valid_num_review(review_type), status: :ok
end
Expand All @@ -189,7 +189,7 @@ def valid_num_review
def has_teams
assignment = Assignment.find_by(id: params[:assignment_id])
if assignment.nil?
render json: { error: "Assignment not found" }, status: :not_found
render json: { error: I18n.t('assignment.not_found') }, status: :not_found
else
render json: assignment.teams?, status: :ok
end
Expand All @@ -200,12 +200,12 @@ def has_teams
def varying_rubrics_by_round?
assignment = Assignment.find_by(id: params[:assignment_id])
if assignment.nil?
render json: { error: "Assignment not found" }, status: :not_found
render json: { error: I18n.t('assignment.not_found') }, status: :not_found
else
if AssignmentQuestionnaire.exists?(assignment_id: assignment.id)
render json: assignment.varying_rubrics_by_round?, status: :ok
else
render json: { error: "No questionnaire/rubric exists for this assignment." }, status: :not_found
render json: { error: I18n.t('assignment.no_questionnaire') }, status: :not_found
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/api/v1/bookmarks_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ def update

# Handle the case when an invalid bookmark id is being passed
def not_found
render json: { error: "Couldn't find Bookmark" }, status: :not_found
render json: { error: I18n.t('bookmarks.not_found') }, status: :not_found
end

# Destroy method deletes the bookmark object with id- {:id}
Expand Down
12 changes: 6 additions & 6 deletions app/controllers/api/v1/courses_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ def update
# Delete a course
def destroy
@course.destroy
render json: { message: "Course with id #{params[:id]}, deleted" }, status: :no_content
render json: { message: I18n.t('course.deleted', id: params[:id]) }, status: :no_content
end

# Adds a Teaching Assistant to the course
Expand All @@ -69,7 +69,7 @@ def view_tas
def remove_ta
result = @course.remove_ta(params[:ta_id])
if result[:success]
render json: { message: "The TA #{result[:ta_name]} has been removed." }, status: :ok
render json: { message: I18n.t('course.ta_removed', ta_name: result[:ta_name]) }, status: :ok
else
render json: { status: "error", message: result[:message] }, status: :not_found
end
Expand All @@ -80,9 +80,9 @@ def copy
# existing_course = Course.find(params[:id])
success = @course.copy_course
if success
render json: { message: "The course #{@course.name} has been successfully copied" }, status: :ok
render json: { message: I18n.t('course.copy_success', name: @course.name) }, status: :ok
else
render json: { message: "The course was not able to be copied" }, status: :unprocessable_entity
render json: { message: I18n.t('course.copy_failure') }, status: :unprocessable_entity
end
end

Expand All @@ -99,10 +99,10 @@ def course_params
end

def course_not_found
render json: { error: "Course with id #{params[:id]} not found" }, status: :not_found
render json: { error: I18n.t('course.not_found', id: params[:id]) }, status: :not_found
end

def parameter_missing
render json: { error: "Parameter missing" }, status: :unprocessable_entity
render json: { error: I18n.t('course.parameter_missing') }, status: :unprocessable_entity
end
end
4 changes: 2 additions & 2 deletions app/controllers/api/v1/institutions_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ def update
def destroy
@institution = Institution.find(params[:id])
@institution.destroy
render json: { message: 'Institution deleted' }, status: :ok
render json: { message: I18n.t('institution.deleted') }, status: :ok
end

private
Expand All @@ -52,6 +52,6 @@ def institution_params
end

def institution_not_found
render json: { error: 'Institution not found' }, status: :not_found
render json: { error: I18n.t('institution.not_found') }, status: :not_found
end
end
Loading