started to rework memberships controller
This commit is contained in:
parent
7a810ae4f9
commit
d62d390300
11 changed files with 186 additions and 102 deletions
4
.dockerignore
Normal file
4
.dockerignore
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
erd.pdf
|
||||
.git
|
||||
.gitignore
|
||||
.gitattributes
|
||||
65
Dockerfile
Normal file
65
Dockerfile
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
#
|
||||
# This is an unofficial Alpine image embedding rbenv
|
||||
# Inspired by https://github.com/didlich/docker-alpine-rbenv/blob/master/Dockerfile
|
||||
#
|
||||
|
||||
FROM alpine:3.15
|
||||
|
||||
RUN apk add --update \
|
||||
bash \
|
||||
git \
|
||||
wget \
|
||||
curl \
|
||||
vim \
|
||||
build-base \
|
||||
readline-dev \
|
||||
openssl-dev \
|
||||
zlib-dev \
|
||||
&& rm -rf /var/cache/apk/*
|
||||
|
||||
# rbenv
|
||||
ENV PATH /usr/local/rbenv/shims:/usr/local/rbenv/bin:$PATH
|
||||
ENV RBENV_ROOT /usr/local/rbenv
|
||||
ENV RUBY_VERSION 3.0.2
|
||||
ENV CONFIGURE_OPTS --disable-install-doc
|
||||
|
||||
RUN apk add --update \
|
||||
linux-headers \
|
||||
imagemagick-dev \
|
||||
libffi-dev \
|
||||
libffi-dev \
|
||||
libpq-dev \
|
||||
&& rm -rf /var/cache/apk/*
|
||||
|
||||
RUN git clone --depth 1 git://github.com/sstephenson/rbenv.git ${RBENV_ROOT} \
|
||||
&& git clone --depth 1 https://github.com/sstephenson/ruby-build.git ${RBENV_ROOT}/plugins/ruby-build \
|
||||
&& git clone --depth 1 git://github.com/jf/rbenv-gemset.git ${RBENV_ROOT}/plugins/rbenv-gemset \
|
||||
&& ${RBENV_ROOT}/plugins/ruby-build/install.sh
|
||||
|
||||
RUN echo 'eval "$(rbenv init -)"' >> /etc/profile.d/rbenv.sh
|
||||
|
||||
RUN rbenv install $RUBY_VERSION \
|
||||
&& rbenv global $RUBY_VERSION
|
||||
|
||||
RUN gem install bundler
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Getting required gems
|
||||
COPY Gemfile ./
|
||||
RUN bundle install
|
||||
|
||||
COPY [^Gemfile]* ./
|
||||
|
||||
# RUN RAILS_ENV=production / db:create
|
||||
# RUN / db:migrate
|
||||
|
||||
# Deleting useless packages
|
||||
# RUN apk del git wget curl build-base \
|
||||
# rm -rf /var/cache/apk/*
|
||||
|
||||
EXPOSE 9000
|
||||
|
||||
CMD [ "top" ]
|
||||
|
||||
# CMD [ "rails", "server", "-p 9000", "-b 127.0.0.1", "-e production" ]
|
||||
|
|
@ -3,29 +3,30 @@ class Api::V1::MembershipsController < ApplicationController
|
|||
before_action :check_login
|
||||
|
||||
def index
|
||||
render json: MembershipSerializer.new(Membership.all).serializable_hash.to_json
|
||||
if !params[:team_id]
|
||||
render json: MembershipSerializer.new(Membership.all).serializable_hash.to_json
|
||||
else
|
||||
render json: MembershipSerializer.new(Team.find(params[:team_id]).memberships).serializable_hash.to_json
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def show
|
||||
render json: MembershipSerializer.new(@membership).serializable_hash.to_json
|
||||
end
|
||||
|
||||
def create
|
||||
member_id = User.where(username: params[:membership][:username])[0].id
|
||||
team_id = Team.where(name: params[:membership][:team_name])[0].id
|
||||
|
||||
membership = Membership.new(team_id: team_id, member_id: member_id, can_edit: false)
|
||||
|
||||
if membership.save
|
||||
render json: MembershipSerializer.new(membership).serializable_hash.to_json, status: :created
|
||||
else
|
||||
render json: membership.errors, status: :unprocessable_entity
|
||||
end
|
||||
end
|
||||
# def create
|
||||
# membership = current_user.memberships.build(membership_params)
|
||||
|
||||
# if membership.save
|
||||
# render json: MembershipSerializer.new(membership).serializable_hash.to_json, status: :created
|
||||
# else
|
||||
# render json: membership.errors, status: :unprocessable_entity
|
||||
# end
|
||||
# end
|
||||
|
||||
def update
|
||||
if params[:membership][:can_edit]
|
||||
if @membership.update(memberships_params)
|
||||
if @membership.update(membership_params)
|
||||
render json: MembershipSerializer.new(@membership).serializable_hash.to_json, status: :ok
|
||||
else
|
||||
render json: @membership.errors, status: :unprocessable_entity
|
||||
|
|
@ -42,7 +43,7 @@ class Api::V1::MembershipsController < ApplicationController
|
|||
|
||||
private
|
||||
|
||||
def memberships_params
|
||||
def membership_params
|
||||
params.require(:membership).permit(:can_edit)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ class Activity < ApplicationRecord
|
|||
has_one :user, :through => :joined_user_activity
|
||||
|
||||
has_many :tasks
|
||||
|
||||
|
||||
validates :name, presence: true
|
||||
validates :author, presence: true
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,7 +1,4 @@
|
|||
class Membership < ApplicationRecord
|
||||
# attr_readonly :member
|
||||
# attr_readonly :team
|
||||
|
||||
validates :member, presence: :true
|
||||
validates :team, presence: :true
|
||||
validates_uniqueness_of :member, scope: :team, message: "user already part of this team"
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
class Task < ApplicationRecord
|
||||
belongs_to :activity
|
||||
belongs_to :owner, class_name: "User"
|
||||
|
||||
validates :name, presence: true
|
||||
validates :owner, presence: true
|
||||
validates :activity, presence: true
|
||||
validates :start_time, presence: true
|
||||
|
||||
belongs_to :activity
|
||||
belongs_to :owner, class_name: "User"
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,31 +1,21 @@
|
|||
# SQLite. Versions 3.8.0 and up are supported.
|
||||
# gem install sqlite3
|
||||
#
|
||||
# Ensure the SQLite 3 gem is defined in your Gemfile
|
||||
# gem 'sqlite3'
|
||||
#
|
||||
default: &default
|
||||
# adapter: sqlite3
|
||||
adapter: postgresql
|
||||
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
|
||||
timeout: 5000
|
||||
username: <%= ENV['PG_USER'] %>
|
||||
password: <%= ENV['PG_USER_PWD'] %>
|
||||
|
||||
development:
|
||||
<<: *default
|
||||
# database: db/development.sqlite3
|
||||
database: chronobriq_development
|
||||
adapter: postgresql
|
||||
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
|
||||
timeout: 5000
|
||||
username: <%= ENV['PG_USER'] %>
|
||||
password: <%= ENV['PG_USER_PWD'] %>
|
||||
|
||||
# Warning: The database defined as "test" will be erased and
|
||||
# re-generated from your development database when you run "rake".
|
||||
# Do not set this db to the same as development or production.
|
||||
test:
|
||||
<<: *default
|
||||
# database: db/test.sqlite3
|
||||
database: chronobriq_test
|
||||
<<: *default
|
||||
database: chronobriq_test
|
||||
|
||||
development:
|
||||
<<: *default
|
||||
database: chronobriq_development
|
||||
|
||||
production:
|
||||
<<: *default
|
||||
# database: db/production.sqlite3
|
||||
database: chronobriq_production
|
||||
<<: *default
|
||||
database: chronobriq_production
|
||||
|
|
|
|||
|
|
@ -3,12 +3,14 @@ Rails.application.routes.draw do
|
|||
namespace :v1 do
|
||||
resources :users
|
||||
resources :tokens, only: %i[create]
|
||||
resources :teams
|
||||
resources :memberships
|
||||
resources :teams do
|
||||
resources :memberships
|
||||
end
|
||||
resources :memberships, only: %i[index]
|
||||
resources :activities do
|
||||
resources :tasks
|
||||
end
|
||||
resources :tasks
|
||||
resources :tasks, only: %i[index]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
15
docker-compose.yml
Normal file
15
docker-compose.yml
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
version: "3"
|
||||
services:
|
||||
chronobriq-api:
|
||||
build: .
|
||||
ports:
|
||||
- "9000:9000"
|
||||
depends_on:
|
||||
- db
|
||||
db:
|
||||
image: postgres:12-alpine
|
||||
volumes:
|
||||
- database:/var/lib/postgresql/chronobriq-api
|
||||
|
||||
volumes:
|
||||
database:
|
||||
|
|
@ -10,29 +10,39 @@ class Api::V1::MembershipsControllerTest < ActionDispatch::IntegrationTest
|
|||
end
|
||||
|
||||
# INDEX
|
||||
test "should access Membership index" do
|
||||
test "should access Membership index - specifix team" do
|
||||
get api_v1_team_memberships_url(@team),
|
||||
headers: { Authorization: JsonWebToken.encode(user_id: @user.id) },
|
||||
as: :json
|
||||
assert_response :success
|
||||
|
||||
json_response = JSON.parse(self.response.body)
|
||||
assert_equal @membership.member_id, json_response['data'][0]['attributes']['member_id']
|
||||
end
|
||||
|
||||
test "should access Membership index - all teams" do
|
||||
get api_v1_memberships_url,
|
||||
headers: { Authorization: JsonWebToken.encode(user_id: @user.id) },
|
||||
as: :json
|
||||
assert_response :success
|
||||
end
|
||||
|
||||
test "should forbid Membership index" do
|
||||
get api_v1_memberships_url,
|
||||
test "should not access Membership index" do
|
||||
get api_v1_team_memberships_url(@team),
|
||||
as: :json
|
||||
assert_response :forbidden
|
||||
end
|
||||
|
||||
# SHOW
|
||||
test "should show Membership" do
|
||||
get api_v1_memberships_url(@membership),
|
||||
get api_v1_team_memberships_url(@team, @membership),
|
||||
headers: { Authorization: JsonWebToken.encode(user_id: @user.id) },
|
||||
as: :json
|
||||
assert_response :success
|
||||
end
|
||||
|
||||
test "should forbid show Membership" do
|
||||
get api_v1_memberships_url(@membership),
|
||||
get api_v1_team_memberships_url(@team, @membership),
|
||||
as: :json
|
||||
assert_response :forbidden
|
||||
end
|
||||
|
|
@ -41,60 +51,60 @@ class Api::V1::MembershipsControllerTest < ActionDispatch::IntegrationTest
|
|||
# test "should create membership" do
|
||||
# assert_difference("Membership.count") do
|
||||
# post api_v1_memberships_url,
|
||||
# params: { membership: { team_id: @team.id, member_id: @user.id, can_edit: false } },
|
||||
# params: { membership: { team_id: @team2.id, member_id: @user2.id, can_edit: false } },
|
||||
# headers: { Authorization: JsonWebToken.encode(user_id: @user.id) },
|
||||
# as: :json
|
||||
# end
|
||||
# assert_response :created
|
||||
# end
|
||||
|
||||
test "should forbid create membership" do
|
||||
assert_no_difference("Membership.count") do
|
||||
post api_v1_memberships_url,
|
||||
params: { membership: { team_id: @team.id, member_id: @user.id, can_edit: false } },
|
||||
as: :json
|
||||
end
|
||||
assert_response :forbidden
|
||||
end
|
||||
# test "should forbid create membership" do
|
||||
# assert_no_difference("Membership.count") do
|
||||
# post api_v1_memberships_url,
|
||||
# params: { membership: { team_id: @team.id, member_id: @user.id, can_edit: false } },
|
||||
# as: :json
|
||||
# end
|
||||
# assert_response :forbidden
|
||||
# end
|
||||
|
||||
# UPDATE
|
||||
test "should update membership" do
|
||||
patch api_v1_membership_url(@membership),
|
||||
headers: { Authorization: JsonWebToken.encode(user_id: @user.id) },
|
||||
params: { membership: { can_edit: true } },
|
||||
as: :json
|
||||
assert_response :success
|
||||
end
|
||||
# # UPDATE
|
||||
# test "should update membership" do
|
||||
# patch api_v1_membership_url(@membership),
|
||||
# headers: { Authorization: JsonWebToken.encode(user_id: @user.id) },
|
||||
# params: { membership: { can_edit: true } },
|
||||
# as: :json
|
||||
# assert_response :success
|
||||
# end
|
||||
|
||||
test "should forbid update membership" do
|
||||
patch api_v1_membership_url(@membership),
|
||||
params: { membership: { can_edit: true } },
|
||||
as: :json
|
||||
assert_response :forbidden
|
||||
end
|
||||
# test "should forbid update membership" do
|
||||
# patch api_v1_membership_url(@membership),
|
||||
# params: { membership: { can_edit: true } },
|
||||
# as: :json
|
||||
# assert_response :forbidden
|
||||
# end
|
||||
|
||||
test "should forbid update read_only attributes - team_id" do
|
||||
patch api_v1_membership_url(@membership),
|
||||
headers: { Authorization: JsonWebToken.encode(user_id: @user.id) },
|
||||
params: { membership: { team_id: @team2.id, member_id: @user2.id } },
|
||||
as: :json
|
||||
assert_response :unprocessable_entity
|
||||
end
|
||||
# test "should forbid update read_only attributes - team_id" do
|
||||
# patch api_v1_membership_url(@membership),
|
||||
# headers: { Authorization: JsonWebToken.encode(user_id: @user.id) },
|
||||
# params: { membership: { team_id: @team2.id, member_id: @user2.id } },
|
||||
# as: :json
|
||||
# assert_response :unprocessable_entity
|
||||
# end
|
||||
|
||||
# DESTROY
|
||||
test "should destroy membership" do
|
||||
assert_difference('Membership.count', -1) do
|
||||
delete api_v1_membership_url(@membership),
|
||||
headers: { Authorization: JsonWebToken.encode(user_id: @user.id) },
|
||||
as: :json
|
||||
end
|
||||
assert_response :no_content
|
||||
end
|
||||
# # DESTROY
|
||||
# test "should destroy membership" do
|
||||
# assert_difference('Membership.count', -1) do
|
||||
# delete api_v1_membership_url(@membership),
|
||||
# headers: { Authorization: JsonWebToken.encode(user_id: @user.id) },
|
||||
# as: :json
|
||||
# end
|
||||
# assert_response :no_content
|
||||
# end
|
||||
|
||||
test "should forbid destroy membership" do
|
||||
assert_no_difference('Membership.count') do
|
||||
delete api_v1_membership_url(@membership), as: :json
|
||||
end
|
||||
assert_response :forbidden
|
||||
end
|
||||
# test "should forbid destroy membership" do
|
||||
# assert_no_difference('Membership.count') do
|
||||
# delete api_v1_membership_url(@membership), as: :json
|
||||
# end
|
||||
# assert_response :forbidden
|
||||
# end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -44,17 +44,17 @@ class Api::V1::TasksControllerTest < ActionDispatch::IntegrationTest
|
|||
test "should create task" do
|
||||
assert_difference("Task.count") do
|
||||
post api_v1_activity_tasks_url(@activity),
|
||||
params: { task: { name: @task.name, description: @task.description, owner_id: @user, activity_id: @activity, start_time: DateTime.now } },
|
||||
params: { task: { name: @task.name, description: @task.description, owner_id: @user, start_time: DateTime.now } },
|
||||
headers: { Authorization: JsonWebToken.encode(user_id: @user.id) },
|
||||
as: :json
|
||||
end
|
||||
assert_response :created
|
||||
end
|
||||
|
||||
test "should not create task" do
|
||||
test "should not create task - not logged in" do
|
||||
assert_no_difference("Task.count") do
|
||||
post api_v1_activity_tasks_url(@activity),
|
||||
params: { task: { name: @task.name, description: @task.description, owner_id: @user, activity_id: @activity } },
|
||||
params: { task: { name: @task.name, description: @task.description, owner_id: @user } },
|
||||
as: :json
|
||||
end
|
||||
assert_response :forbidden
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue