From 976a4cf361028034927323032490096d08e9f2c6 Mon Sep 17 00:00:00 2001 From: Eugene Burmakin Date: Sat, 27 Sep 2025 12:03:42 +0200 Subject: [PATCH] Update plan --- FAMILY_PLAN.md | 73 +++++++++++--------------------------------------- 1 file changed, 15 insertions(+), 58 deletions(-) diff --git a/FAMILY_PLAN.md b/FAMILY_PLAN.md index eca9261c..00b2c6be 100644 --- a/FAMILY_PLAN.md +++ b/FAMILY_PLAN.md @@ -58,7 +58,7 @@ end **Columns:** - `id` (UUID, primary key) - `name` (string, not null) -- `creator_id` (UUID, foreign key to users, not null) +- `creator_id` (bigint, foreign key to users, not null) - `created_at` (datetime) - `updated_at` (datetime) @@ -68,30 +68,21 @@ class FamilyMembership < ApplicationRecord # Table: family_memberships # Primary Key: id (UUID) - self.primary_key = :id - belongs_to :family belongs_to :user - validates :family_id, presence: true validates :user_id, presence: true, uniqueness: true # One family per user validates :role, presence: true - validates :status, presence: true - enum role: { owner: 0, member: 1 } - enum status: { active: 0, inactive: 1 } - - scope :active, -> { where(status: :active) } + enum :role, { owner: 0, member: 1 } end ``` **Columns:** - `id` (UUID, primary key) - `family_id` (UUID, foreign key to families, not null) -- `user_id` (UUID, foreign key to users, not null, unique) -- `role` (integer, enum: owner=0, member=1, not null) -- `status` (integer, enum: active=0, inactive=1, not null, default: active) -- `location_sharing_enabled` (boolean, default: true) +- `user_id` (bigint, foreign key to users, not null, unique) +- `role` (integer, enum: owner=0, member=1, not null, default: member) - `created_at` (datetime) - `updated_at` (datetime) @@ -101,8 +92,6 @@ class FamilyInvitation < ApplicationRecord # Table: family_invitations # Primary Key: id (UUID) - self.primary_key = :id - belongs_to :family belongs_to :invited_by, class_name: 'User' @@ -127,7 +116,7 @@ end - `email` (string, not null) - `token` (string, not null, unique) - `expires_at` (datetime, not null) -- `invited_by_id` (UUID, foreign key to users, not null) +- `invited_by_id` (bigint, foreign key to users, not null) - `status` (integer, enum: pending=0, accepted=1, expired=2, cancelled=3, default: pending) - `created_at` (datetime) - `updated_at` (datetime) @@ -141,7 +130,7 @@ has_many :created_families, class_name: 'Family', foreign_key: 'creator_id', dep has_many :sent_family_invitations, class_name: 'FamilyInvitation', foreign_key: 'invited_by_id', dependent: :destroy def in_family? - family_membership&.active? + family_membership.present? end def family_owner? @@ -164,7 +153,7 @@ class CreateFamilies < ActiveRecord::Migration[8.0] create_table :families, id: :uuid do |t| t.string :name, null: false, limit: 50 - t.uuid :creator_id, null: false + t.bigint :creator_id, null: false t.timestamps end @@ -180,10 +169,8 @@ class CreateFamilyMemberships < ActiveRecord::Migration[8.0] def change create_table :family_memberships, id: :uuid do |t| t.uuid :family_id, null: false - t.uuid :user_id, null: false + t.bigint :user_id, null: false t.integer :role, null: false, default: 1 # member - t.integer :status, null: false, default: 0 # active - t.boolean :location_sharing_enabled, null: false, default: true t.timestamps end @@ -205,7 +192,7 @@ class CreateFamilyInvitations < ActiveRecord::Migration[8.0] t.string :email, null: false t.string :token, null: false t.datetime :expires_at, null: false - t.uuid :invited_by_id, null: false + t.bigint :invited_by_id, null: false t.integer :status, null: false, default: 0 # pending t.timestamps end @@ -273,8 +260,7 @@ module Families FamilyMembership.create!( family: family, user: user, - role: :owner, - status: :active + role: :owner ) end @@ -334,7 +320,7 @@ module Families def user_already_in_family? User.joins(:family_membership) - .where(email: email, family_memberships: { status: :active }) + .where(email: email) .exists? end @@ -411,8 +397,7 @@ module Families FamilyMembership.create!( family: invitation.family, user: user, - role: :member, - status: :active + role: :member ) end @@ -476,7 +461,7 @@ module Families end def deactivate_membership - user.family_membership.update!(status: :inactive) + user.family_membership.destroy! end def send_notification @@ -500,7 +485,6 @@ module Families family.members .joins(:family_membership) - .where(family_memberships: { location_sharing_enabled: true }) .map { |member| latest_location_for(member) } .compact end @@ -643,7 +627,7 @@ class FamilyMembershipsController < ApplicationController if @membership.owner? && @family.members.count > 1 redirect_to family_path(@family), alert: 'Transfer ownership before removing yourself' else - @membership.update!(status: :inactive) + @membership.destroy! redirect_to family_path(@family), notice: 'Member removed successfully' end end @@ -660,7 +644,7 @@ class FamilyMembershipsController < ApplicationController end def membership_params - params.require(:family_membership).permit(:location_sharing_enabled) + params.require(:family_membership).permit() end end ``` @@ -946,9 +930,6 @@ get '/family', to: 'families#index', as: 'family_dashboard'
<%= member.email %>
<%= member.family_membership.role.humanize %> - <% unless member.family_membership.location_sharing_enabled? %> - • Location sharing disabled - <% end %>
@@ -1118,27 +1099,6 @@ get '/family', to: 'families#index', as: 'family_dashboard' class: "input input-bordered w-full" %> - -
-

Your Location Sharing

- - <%= form_with model: [current_user.family, current_user.family_membership], - url: family_member_path(current_user.family, current_user.family_membership), - method: :patch, local: true do |membership_form| %> - - - -
- <%= membership_form.submit "Update Sharing Settings", - class: "btn btn-sm btn-outline" %> -
- <% end %> -
-
@@ -1327,7 +1287,6 @@ RSpec.describe FamilyMembership, type: :model do describe 'enums' do it { is_expected.to define_enum_for(:role).with_values(owner: 0, member: 1) } - it { is_expected.to define_enum_for(:status).with_values(active: 0, inactive: 1) } end end @@ -1381,7 +1340,6 @@ RSpec.describe Families::CreateService do service.call membership = user.family_membership expect(membership.role).to eq('owner') - expect(membership.status).to eq('active') end it 'sends notification' do @@ -1493,7 +1451,6 @@ RSpec.describe 'Family Workflow', type: :request do membership = invitee.family_membership expect(membership.family).to eq(family) expect(membership.role).to eq('member') - expect(membership.status).to eq('active') # Verify invitation updated invitation.reload