defios 0.1.0

Main github on-chain integrations by DefiOS
Documentation
use crate::event::AddRoadmapDataEvent;
use crate::state::{Repository, RoadMapMetaDataStore, RoadmapOutlook, VerifiedUser};
use anchor_lang::prelude::*;

#[derive(Accounts)]
pub struct AddMetadata<'info> {
    #[account(mut, address = repository_account.repository_creator.key())]
    pub roadmap_data_adder: Signer<'info>,
    #[account(
        init,
        payer = roadmap_data_adder,
        space = 8+RoadMapMetaDataStore::INIT_SPACE,
        seeds = [
            b"roadmapmetadataadd",
            repository_account.key().as_ref(),
            roadmap_data_adder.key().as_ref()
        ],
        bump
    )]
    pub metadata_account: Account<'info, RoadMapMetaDataStore>,
    #[account(
        mut,
        seeds = [
            b"repository",
            repository_account.id.as_bytes(),
            repository_account.repository_creator.key().as_ref(),
        ],
        bump = repository_account.bump
    )]
    pub repository_account: Account<'info, Repository>,
    #[account(
        seeds = [
            roadmap_verified_user.user_name.as_bytes(),
            roadmap_data_adder.key().as_ref(),
            roadmap_verified_user.name_router.key().as_ref()
        ],
        bump = roadmap_verified_user.bump
    )]
    pub roadmap_verified_user: Account<'info, VerifiedUser>,
    pub system_program: Program<'info, System>,
}

pub fn handler(
    ctx: Context<AddMetadata>,
    roadmap_title: String,
    roadmap_description_link: String,
    roadmap_image_url: String,
    roadmap_outlook: RoadmapOutlook,
) -> Result<()> {
    let roadmap_creation_unix = Clock::get()?.unix_timestamp;
    let metadata_account = &mut ctx.accounts.metadata_account;
    let roadmap_data_adder = &mut ctx.accounts.roadmap_data_adder;
    let repository_account = &ctx.accounts.repository_account;

    metadata_account.bump = ctx.bumps.metadata_account;
    metadata_account.roadmap_title = roadmap_title.clone();
    metadata_account.roadmap_description_link = roadmap_description_link.clone();
    metadata_account.roadmap_creation_unix = roadmap_creation_unix;
    metadata_account.roadmap_creator = roadmap_data_adder.key();
    metadata_account.root_objective = None;
    metadata_account.roadmap_outlook = roadmap_outlook;
    metadata_account.roadmap_image_url = roadmap_image_url.clone();
    metadata_account.roadmap_repository = repository_account.key().clone();

    emit!(AddRoadmapDataEvent {
        roadmap_title: roadmap_title,
        roadmap_description_link: roadmap_description_link,
        roadmap_creation_unix: roadmap_creation_unix as u64,
        roadmap_creator: roadmap_data_adder.key(),
        root_objective_ids: metadata_account.root_objective.clone(),
        roadmap_outlook: roadmap_outlook,
        roadmap_image_url: roadmap_image_url,
        roadmap: metadata_account.key(),
        roadmap_repository: repository_account.key()
    });

    Ok(())
}