//Models
public class Reward_Type
{
[Key]
public int Reward_Type_ID { get; set; }
[Required]
public string Reward_Type_Name { get; set; }
[Required]
public string Reward_Criteria { get; set; }
public int Inventory_ID { get; set; } // Link to Inventory
[ForeignKey(nameof(Inventory_ID))]
public Inventory Inventory { get; set; } // Reference to Inventory item
}
//Viewmodels
public class RewardTypeViewModel
{
public string Reward_Type_Name { get; set; }
public string Reward_Criteria { get; set; }
public int Inventory_ID { get; set; }
}
/controller
[HttpGet]
[Route("getAllRewardTypes")]
public async Task<IActionResult> GetAllRewardTypes()
{
try
{
var rewardTypes = await _appDbContext.Reward_Types
.Include(rt => rt.Inventory) // Include Inventory details
.ToListAsync();
return Ok(rewardTypes);
}
catch (Exception)
{
return BadRequest();
}
}
[HttpPost]
[Route("createRewardType")]
public async Task<IActionResult> CreateRewardType(RewardTypeViewModel rt)
{
try
{
var rewardType = new Reward_Type
{
Reward_Type_Name = rt.Reward_Type_Name,
Reward_Criteria = rt.Reward_Criteria,
Inventory_ID = rt.Inventory_ID
};
_appDbContext.Reward_Types.Add(rewardType);
await _appDbContext.SaveChangesAsync();
return CreatedAtAction(nameof(GetRewardTypeById), new { id = rewardType.Reward_Type_ID }, rewardType);
}
catch (Exception)
{
return BadRequest();
}
}
[HttpPost]
[Route("setReward")]
public async Task<IActionResult> SetReward(RewardSetViewModel r)
{
try
{
var reward = new Reward
{
Reward_Issue_Date = r.Reward_Issue_Date,
Reward_Type_ID = r.Reward_Type_ID,
IsPosted = r.IsPosted
};
_appDbContext.Rewards.Add(reward);
await _appDbContext.SaveChangesAsync();
// Automatically populate Reward_Member based on criteria
var members = await _appDbContext.Members // Assuming members criteria is stored in members
.Where(m => /* apply criteria based on reward type */ true)
.ToListAsync();
foreach (var member in members)
{
var rewardMember = new Reward_Member
{
Member_ID = member.Member_ID,
Reward_ID = reward.Reward_ID,
IsRedeemed = false
};
_appDbContext.Reward_Members.Add(rewardMember);
}
await _appDbContext.SaveChangesAsync();
return CreatedAtAction(nameof(GetRewardById), new { id = reward.Reward_ID }, reward);
}
catch (Exception)
{
return BadRequest();
}
}
[HttpPost]
[Route("redeemReward")]
public async Task<IActionResult> RedeemReward([FromBody] RewardRedeemViewModel request)
{
try
{
var rewardMember = await _appDbContext.Reward_Members
.Include(rm => rm.Reward)
.ThenInclude(r => r.Reward_Type)
.FirstOrDefaultAsync(r => r.Reward_ID == request.RewardId && r.Member_ID == request.MemberId);
if (rewardMember == null)
{
return NotFound("Reward not found or not eligible for the member.");
}
if (rewardMember.IsRedeemed)
{
return BadRequest("Reward is already redeemed.");
}
// Reduce inventory quantity
var inventory = await _appDbContext.Inventories.FindAsync(rewardMember.Reward.Reward_Type.Inventory_ID);
if (inventory == null || inventory.Inventory_Item_Quantity <= 0)
{
return BadRequest("Inventory item is not available.");
}
inventory.Inventory_Item_Quantity -= 1;
_appDbContext.Entry(inventory).State = EntityState.Modified;
// Mark reward as redeemed
rewardMember.IsRedeemed = true;
_appDbContext.Entry(rewardMember).State = EntityState.Modified;
await _appDbContext.SaveChangesAsync();
return Ok(new { Status = "Success", Message = "Reward redeemed successfully!" });
}
catch (Exception)
{
return BadRequest("An error occurred while redeeming the reward.");
}
}
public async Task<List<Inventory>> GetAvailableInventoryItems()
{
return await _appDbContext.Inventories
.Where(i => i.Inventory_Item_Quantity > 0)
.ToListAsync();
}
public async Task<bool> ValidateRewardTypeCreation(RewardTypeViewModel rt)
{
var inventory = await _appDbContext.Inventories.FindAsync(rt.Inventory_ID);
return inventory != null && inventory.Inventory_Item_Quantity > 0;
}
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter