db,'privacy','user:'.$user); if((int)$this->db->get_var($this->db->prepare('SELECT GET_LOCK(%s,5)',$key))!==1)throw new CatalogException('abece_booking_privacy_busy',__('Please try again shortly.','abece-booking'),429); try{return $work();}finally{$this->db->get_var($this->db->prepare('SELECT RELEASE_LOCK(%s)',$key));} } public function uniqueAccount(string $email,int $id):bool { $ids=$this->db->get_col($this->db->prepare('SELECT ID FROM %i WHERE user_email=%s LIMIT 2',$this->db->users,$email)); return count($ids)===1&&(int)$ids[0]===$id; } public function own(int $user,string $email):array { $ids=get_posts(['post_type'=>'user_request','post_status'=>['request-pending','request-confirmed','request-completed','request-failed'],'author'=>$user,'posts_per_page'=>20,'orderby'=>'ID','order'=>'DESC','fields'=>'ids']);$out=[]; foreach($ids as $id){$r=wp_get_user_request($id);if($r&&(int)$r->user_id===$user&&strcasecmp($r->email,$email)===0&&in_array($r->action_name,['export_personal_data','remove_personal_data'],true))$out[]=$r;} return $out; } public function consumeRate(int $user,string $type):void { $now=time();$rate=get_user_meta($user,'abece_booking_privacy_request_rate',true);if(!is_array($rate)||($rate['start']??0)<$now-DAY_IN_SECONDS)$rate=['start'=>$now,'count'=>0,'last'=>[]]; if(($rate['count']??0)>=4||($rate['last'][$type]??0)>$now-60)throw new CatalogException('abece_booking_privacy_rate_limit',__('Too many privacy requests. Please wait before trying again or contact the operator.','abece-booking'),429); $rate['count']++;$rate['last'][$type]=$now;update_user_meta($user,'abece_booking_privacy_request_rate',$rate); } }