Learn everything about Solana
Review IV - Implementing Update_Review
In this lesson, we are going to see how we can update an existing review.
Here is the changes we have made to lib.rs in this video:
pub fn update_review(
program_id: &Pubkey,
accounts: &[AccountInfo],
_title: String,
rating: u8,
description: String,
) -> ProgramResult {
msg!("Updating review...");
let account_info_iter = &mut accounts.iter();
let initializer = next_account_info(account_info_iter)?;
let pda_account = next_account_info(account_info_iter)?;
if pda_account.owner != program_id {
return Err(ProgramError::IllegalOwner);
}
if !initializer.is_signer {
msg!("Missing required signature");
return Err(ProgramError::MissingRequiredSignature);
}
msg!("unpacking state account");
let mut account_data =
try_from_slice_unchecked::<AccountState>(&pda_account.data.borrow()).unwrap();
msg!("review title: {}", account_data.title);
let (pda, _bump_seed) = Pubkey::find_program_address(
&[
initializer.key.as_ref(),
account_data.title.as_bytes().as_ref(),
],
program_id,
);
if pda != *pda_account.key {
msg!("Invalid seeds for PDA");
return Err(ReviewError::InvalidPDA.into());
}
msg!("checking if account is initialized");
if !account_data.is_initialized() {
msg!("Account is not initialized");
return Err(ReviewError::UninitializedAccount.into());
}
if rating > 10 || rating < 1 {
return Err(ReviewError::InvalidRating.into());
}
msg!("Review before update:");
msg!("Title: {}", account_data.title);
msg!("Rating: {}", account_data.rating);
msg!("Description: {}", account_data.description);
account_data.rating = rating;
account_data.description = description;
msg!("Review after update:");
msg!("Title: {}", account_data.title);
msg!("Rating: {}", account_data.rating);
msg!("Description: {}", account_data.description);
msg!("serializing account");
account_data.serialize(&mut &mut pda_account.data.borrow_mut()[..])?;
msg!("state account serialized");
Ok(())
}
Comments
You need to enroll in the course to be able to comment!