// Move a member record to the queue for getting their user account removed // (e.g. when they leave us). Set the retention to 2 years instead of just // 6 months, since they have been a member. func (m *MembershipDB) MoveMemberToTrash(id, initiator, reason string) error { var now time.Time = time.Now() var now_long uint64 = uint64(now.Unix()) var uuid cassandra.UUID var mmap map[string]map[string][]*cassandra.Mutation var member *MembershipAgreement var cp *cassandra.ColumnPath = cassandra.NewColumnPath() var cos *cassandra.ColumnOrSuperColumn var del *cassandra.Deletion = cassandra.NewDeletion() var mu *cassandra.Mutation var ts int64 var err error cp.ColumnFamily = "members" cp.Column = []byte("pb_data") uuid, err = cassandra.GenTimeUUID(&now) if err != nil { return err } cos, err = m.conn.Get( []byte(memberPrefix+id), cp, cassandra.ConsistencyLevel_QUORUM) if err != nil { return err } member = new(MembershipAgreement) err = proto.Unmarshal(cos.Column.Value, member) if err != nil { return err } del.Predicate = cassandra.NewSlicePredicate() del.Predicate.ColumnNames = allColumns del.Timestamp = cos.Column.Timestamp mu = cassandra.NewMutation() mu.Deletion = del mmap = make(map[string]map[string][]*cassandra.Mutation) mmap[memberPrefix+id] = make(map[string][]*cassandra.Mutation) mmap[memberPrefix+id]["members"] = []*cassandra.Mutation{mu} member.Metadata.GoodbyeInitiator = &initiator member.Metadata.GoodbyeTimestamp = &now_long member.Metadata.GoodbyeReason = &reason ts = now.UnixNano() cos.Column = cassandra.NewColumn() cos.Column.Name = []byte("pb_data") cos.Column.Timestamp = &ts cos.Column.Value, err = proto.Marshal(member) if err != nil { return err } mu = cassandra.NewMutation() mu.ColumnOrSupercolumn = cos mmap[dequeuePrefix+id] = make(map[string][]*cassandra.Mutation) mmap[dequeuePrefix+string([]byte(uuid))] = make(map[string][]*cassandra.Mutation) mmap[dequeuePrefix+string([]byte(uuid))]["membership_dequeue"] = []*cassandra.Mutation{mu} err = m.conn.AtomicBatchMutate( mmap, cassandra.ConsistencyLevel_QUORUM) return err }