started to rework memberships controller

This commit is contained in:
Lou 2022-02-20 21:49:48 +01:00
commit d62d390300
11 changed files with 186 additions and 102 deletions

4
.dockerignore Normal file
View file

@ -0,0 +1,4 @@
erd.pdf
.git
.gitignore
.gitattributes

65
Dockerfile Normal file
View 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" ]

View file

@ -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

View file

@ -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

View file

@ -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"

View file

@ -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

View file

@ -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

View file

@ -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
View 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:

View file

@ -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

View file

@ -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