diff --git a/app/controllers/api/v1/activities_controller.rb b/app/controllers/api/v1/activities_controller.rb new file mode 100644 index 000000000..474e9726d --- /dev/null +++ b/app/controllers/api/v1/activities_controller.rb @@ -0,0 +1,82 @@ +# frozen_string_literal: true + +module Api + module V1 + class ActivitiesController < BaseController + before_action :load_team + before_action :load_project + before_action :load_project_activity, only: :project_activity + before_action :load_experiment, except: %i( + project_activities project_activity + ) + before_action :load_task, except: %i(project_activities project_activity) + before_action :load_activity, only: :show + + def index + activities = @my_module.activities + .page(params.dig(:page, :number)) + .per(params.dig(:page, :size)) + + render jsonapi: activities, + each_serializer: ActivitySerializer + end + + def show + render jsonapi: @activity, serializer: ActivitySerializer + end + + def project_activities + activities = @project.activities + .page(params.dig(:page, :number)) + .per(params.dig(:page, :size)) + + render jsonapi: activities, + each_serializer: ActivitySerializer + end + + def project_activity + render jsonapi: @project_activity, serializer: ActivitySerializer + end + + private + + def load_team + @team = Team.find(params.require(:team_id)) + render jsonapi: {}, status: :forbidden unless can_read_team?(@team) + end + + def load_project + @project = @team.projects.find(params.require(:project_id)) + render jsonapi: {}, status: :forbidden unless can_read_project?( + @project + ) + end + + def load_experiment + @experiment = @project.experiments.find(params.require(:experiment_id)) + render jsonapi: {}, status: :forbidden unless can_read_experiment?( + @experiment + ) + end + + def load_task + @my_module = @experiment.my_modules.find(params.require(:task_id)) + render jsonapi: {}, status: :not_found if @my_module.nil? + end + + def load_activity + @activity = @my_module.activities.find( + params.require(:id) + ) + render jsonapi: {}, status: :not_found if @activity.nil? + end + + def load_project_activity + @project_activity = @project.activities.find( + params.require(:id) + ) + render jsonapi: {}, status: :not_found if @project_activity.nil? + end + end + end +end diff --git a/app/controllers/api/v1/project_comments_controller.rb b/app/controllers/api/v1/project_comments_controller.rb new file mode 100644 index 000000000..bca71a462 --- /dev/null +++ b/app/controllers/api/v1/project_comments_controller.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +module Api + module V1 + class ProjectCommentsController < BaseController + before_action :load_team + before_action :load_project + before_action :load_project_comment, only: :show + + def index + project_comments = @project.project_comments + .page(params.dig(:page, :number)) + .per(params.dig(:page, :size)) + + render jsonapi: project_comments, + each_serializer: ProjectCommentSerializer + end + + def show + render jsonapi: @project_comment, serializer: ProjectCommentSerializer + end + + private + + def load_team + @team = Team.find(params.require(:team_id)) + render jsonapi: {}, status: :forbidden unless can_read_team?(@team) + end + + def load_project + @project = @team.projects.find(params.require(:project_id)) + render jsonapi: {}, status: :forbidden unless can_read_project?( + @project + ) + end + + def load_project_comment + @project_comment = @project.project_comments.find(params.require(:id)) + render jsonapi: {}, status: :not_found if @project_comment.nil? + end + end + end +end diff --git a/app/controllers/api/v1/projects_controller.rb b/app/controllers/api/v1/projects_controller.rb index ce0e73068..0cc5c05d0 100644 --- a/app/controllers/api/v1/projects_controller.rb +++ b/app/controllers/api/v1/projects_controller.rb @@ -6,7 +6,6 @@ module Api before_action :load_team before_action :load_project, only: :show - def index projects = @team.projects .page(params.dig(:page, :number)) diff --git a/app/controllers/api/v1/reports_controller.rb b/app/controllers/api/v1/reports_controller.rb new file mode 100644 index 000000000..01f527f53 --- /dev/null +++ b/app/controllers/api/v1/reports_controller.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +module Api + module V1 + class ReportsController < BaseController + before_action :load_team + before_action :load_project + before_action :load_report, only: :show + + def index + reports = @project.reports + .page(params.dig(:page, :number)) + .per(params.dig(:page, :size)) + + render jsonapi: reports, each_serializer: ReportSerializer + end + + def show + render jsonapi: @report, serializer: ReportSerializer + end + + private + + def load_team + @team = Team.find(params.require(:team_id)) + render jsonapi: {}, status: :forbidden unless can_read_team?(@team) + end + + def load_project + @project = @team.projects.find(params.require(:project_id)) + render jsonapi: {}, status: :forbidden unless can_read_project?( + @project + ) + end + + def load_report + @report = @project.reports.find(params.require(:id)) + render jsonapi: {}, status: :not_found if @report.nil? + end + end + end +end diff --git a/app/controllers/api/v1/user_projects_controller.rb b/app/controllers/api/v1/user_projects_controller.rb new file mode 100644 index 000000000..36e3eca2b --- /dev/null +++ b/app/controllers/api/v1/user_projects_controller.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +module Api + module V1 + class UserProjectsController < BaseController + before_action :load_team + before_action :load_project + before_action :load_user_project, only: :show + + def index + user_projects = @project.user_projects + .page(params.dig(:page, :number)) + .per(params.dig(:page, :size)) + + render jsonapi: user_projects, each_serializer: UserProjectSerializer + end + + def show + render jsonapi: @user_project, serializer: UserProjectSerializer + end + + private + + def load_team + @team = Team.find(params.require(:team_id)) + render jsonapi: {}, status: :forbidden unless can_read_team?(@team) + end + + def load_project + @project = @team.projects.find(params.require(:project_id)) + render jsonapi: {}, status: :forbidden unless can_read_project?( + @project + ) + end + + def load_user_project + @user_project = @project.user_projects.find(params.require(:id)) + render jsonapi: {}, status: :not_found if @user_project.nil? + end + end + end +end diff --git a/app/serializers/api/v1/activity_serializer.rb b/app/serializers/api/v1/activity_serializer.rb new file mode 100644 index 000000000..50b614923 --- /dev/null +++ b/app/serializers/api/v1/activity_serializer.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module Api + module V1 + class ActivitySerializer < ActiveModel::Serializer + type :activities + attributes :id, :my_module_id, :user_id, :type_of, :message, :created_at, + :updated_at, :project_id, :experiment_id + belongs_to :my_module, serializer: MyModuleSerializer, optional: true + belongs_to :experiment, serializer: ExperimentSerializer, optional: true + belongs_to :project, serializer: ProjectSerializer + end + end +end diff --git a/app/serializers/api/v1/project_comment_serializer.rb b/app/serializers/api/v1/project_comment_serializer.rb new file mode 100644 index 000000000..b62ebebef --- /dev/null +++ b/app/serializers/api/v1/project_comment_serializer.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Api + module V1 + class ProjectCommentSerializer < ActiveModel::Serializer + type :project_comments + attributes :id, :message, :user_id, :created_at, :updated_at, + :last_modified_by_id, :type, :associated_id + + belongs_to :project, serializer: ProjectSerializer + end + end +end diff --git a/app/serializers/api/v1/report_serializer.rb b/app/serializers/api/v1/report_serializer.rb new file mode 100644 index 000000000..0abff7e7e --- /dev/null +++ b/app/serializers/api/v1/report_serializer.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Api + module V1 + class ReportSerializer < ActiveModel::Serializer + type :reports + attributes :id, :name, :description, :project_id, :user_id, :created_at, + :updated_at, :last_modified_by_id, :team_id + + belongs_to :project, serializer: ProjectSerializer + end + end +end diff --git a/app/serializers/api/v1/user_project_serializer.rb b/app/serializers/api/v1/user_project_serializer.rb new file mode 100644 index 000000000..ba2b1899e --- /dev/null +++ b/app/serializers/api/v1/user_project_serializer.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Api + module V1 + class UserProjectSerializer < ActiveModel::Serializer + type :user_projects + attributes :id, :role, :user_id, :project_id, :created_at, :updated_at, + :assigned_by_id + + belongs_to :project, serializer: ProjectSerializer + end + end +end diff --git a/config/routes.rb b/config/routes.rb index 21567b83b..45a35c544 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -556,6 +556,14 @@ Rails.application.routes.draw do end resources :projects, only: %i(index show), path: 'projects', as: :projects do + resources :user_projects, only: %i(index show), + path: 'user_projects', as: :user_projects + resources :project_comments, only: %i(index show), + path: 'project_comments', as: :project_comments + resources :reports, only: %i(index show), + path: 'reports', as: :reports + get 'activities', to: 'activities#project_activities' + get 'activities/:id', to: 'activities#project_activity' resources :experiments, only: %i(index show) do resources :my_modules, only: %i(index show),