# Class MedicineRepository

Namespace
  adas_core.Infrastructure.Repositories

Assembly
  adas-core.Infrastructure.dll

Repository implementation for managing Medicine entities in MongoDB. Provides CRUD operations, search, pagination, and aggregation capabilities specific to medicines.

    public class MedicineRepository : MongoRepository<Medicine>, IMedicineRepository, IMongoRepository<Medicine>

Inheritance
  object
  MongoRepository<Medicine>
  MedicineRepository

Implements
  IMedicineRepository
  IMongoRepository<Medicine>

Inherited Members
  MongoRepository<Medicine>.Db
  MongoRepository<Medicine>.Collection
  MongoRepository<Medicine>.InsertOneAsync(Medicine)
  MongoRepository<Medicine>.UpdateOneAsync(ObjectId, Medicine)
  MongoRepository<Medicine>.DeleteAsync(ObjectId)
  MongoRepository<Medicine>.CreateIndexes()
  MongoRepository<Medicine>.InsertInitialLoad()
  MongoRepository<Medicine>.InsertManyAsync(List<Medicine>)
  MongoRepository<Medicine>.UpdateManyObjectIdAsync(string, ObjectId, ObjectId)
  MongoRepository<Medicine>.DeleteAsync(string)
  MongoRepository<Medicine>.CollectionExists(string)
  object.Equals(object)
  object.Equals(object, object)
  object.GetHashCode()
  object.GetType()
  object.MemberwiseClone()
  object.ReferenceEquals(object, object)
  object.ToString()

Extension Methods
  NumberUtils.IsNumber(object)
  NumberUtils.ToDouble(object)
  ObjectUtils.ToStr(object?)

## Constructors

### MedicineRepository(IOptions<ApiSettings>, IMongoDatabase)

Initializes a new instance of the MedicineRepository class.

    public MedicineRepository(IOptions<ApiSettings> apiSettings, IMongoDatabase database)

#### Parameters

`apiSettings` IOptions<ApiSettings>

  The application API settings containing configuration values, including the collection name. Cannot be null.

`database` IMongoDatabase

  The MongoDB database instance used to access the collection.

#### Exceptions

ArgumentNullException

  Thrown when `apiSettings` is null.

## Methods

### DeleteMedicineById(ObjectId)

Asynchronously deletes a medicine from the database by its unique identifier.

    public Task DeleteMedicineById(ObjectId medicineId)

#### Parameters

`medicineId` ObjectId

  The MongoDB.Bson.ObjectId of the medicine to delete.

#### Returns

Task

  A Task representing the asynchronous delete operation.

### GetAll()

Asynchronously retrieves all medicines stored in the collection.

    public Task<List<Medicine>> GetAll()

#### Returns

Task<List<Medicine>>

  A Task<TResult> representing the asynchronous operation. The task result contains a list of all Medicine objects. Returns an empty list if the collection is empty.

### GetAllGroups()

Retrieves all distinct medicine groups available in the collection.

    public Task<List<string>> GetAllGroups()

#### Returns

Task<List<string>>

  A Task<TResult> representing the asynchronous operation, containing a list of distinct group names as strings.

#### Exceptions

NotImplementedException

  This method is not yet implemented.

### GetCollectionName()

Gets the name of the MongoDB collection used to store medicines. Falls back to the default "medicines" collection name when not configured in the API settings.

    public override string GetCollectionName()

#### Returns

string

  The collection name retrieved from the API settings, or "medicines" if not configured.

### GetDistinctFieldDataQuery(string)

Builds an aggregation pipeline that retrieves the distinct values of a specified array field from all medicines. The pipeline unwinds the field, groups by its value, sorts alphabetically, and projects the result with the original field name.

    public IAggregateFluent<BsonDocument> GetDistinctFieldDataQuery(string field)

#### Parameters

`field` string

  The name of the array field on the Medicine document to retrieve distinct values for (for example, "Codes", "Type", or "Group").

#### Returns

IAggregateFluent<BsonDocument>

  An MongoDB.Driver.IAggregateFluent<TResult> representing the aggregation pipeline that, when executed, yields documents containing the distinct values of the specified field.

### GetMedicine(string)

Asynchronously retrieves a medicine whose `Codes` or `Notes` collection contains the specified code.

    public Task<Medicine?> GetMedicine(string code)

#### Parameters

`code` string

  The code or note text to search for within the medicine's codes or notes.

#### Returns

Task<Medicine>

  A Task<TResult> representing the asynchronous operation. The task result contains the first Medicine matching the criteria, or null if no match is found.

### GetMedicineByCodeOrNote(List<string>)

Asynchronously retrieves all medicines whose `Codes` array contains any of the specified code values.

    public Task<List<Medicine>> GetMedicineByCodeOrNote(List<string> codeNotes)

#### Parameters

`codeNotes` List<string>

  A list of code strings to match against the medicine's codes. At least one code must match.

#### Returns

Task<List<Medicine>>

  A Task<TResult> representing the asynchronous operation. The task result contains a list of matching Medicine objects. Returns an empty list if no matches are found.

### GetMedicineById(ObjectId)

Asynchronously retrieves a medicine by its unique identifier.

    public Task<Medicine?> GetMedicineById(ObjectId medicineId)

#### Parameters

`medicineId` ObjectId

  The MongoDB.Bson.ObjectId of the medicine to retrieve.

#### Returns

Task<Medicine>

  A Task<TResult> representing the asynchronous operation. The task result contains the Medicine if found; otherwise, null.

### GetMedicineByName(string)

Asynchronously retrieves a medicine by its exact name.

    public Task<Medicine?> GetMedicineByName(string name)

#### Parameters

`name` string

  The exact name of the medicine to search for.

#### Returns

Task<Medicine>

  A Task<TResult> representing the asynchronous operation. The task result contains the Medicine if found; otherwise, null.

### GetPaginatedMedicines(PaginationFilter)

Retrieves a paginated, sorted, and filtered set of medicines based on the provided pagination filter. Results are sorted ascending by name. Supports optional case-insensitive regex match on the medicine name, and exact matches on code, type, and group.

    public IFindFluent<Medicine, Medicine> GetPaginatedMedicines(PaginationFilter filter)

#### Parameters

`filter` PaginationFilter

  The PaginationFilter containing pagination and filtering criteria.

#### Returns

IFindFluent<Medicine, Medicine>

  An MongoDB.Driver.IFindFluent<TDocument, TProjection> instance that can be used to further refine and execute the query. When no filters are provided, all medicines are returned sorted by name.

### PostMedicine(Medicine)

Asynchronously inserts a new medicine into the database and returns the inserted entity (looked up by name).

    public Task<Medicine?> PostMedicine(Medicine medicine)

#### Parameters

`medicine` Medicine

  The Medicine instance to insert.

#### Returns

Task<Medicine>

  A Task<TResult> representing the asynchronous operation. The task result contains the newly inserted Medicine retrieved by its name, or null if the lookup fails.

### UpdateMedicine(Medicine)

Asynchronously updates an existing medicine in the database and returns the updated entity.

    public Task<Medicine?> UpdateMedicine(Medicine medicine)

#### Parameters

`medicine` Medicine

  The Medicine instance containing the updated values. The MongoDB.Bson.ObjectId is used to identify the document.

#### Returns

Task<Medicine>

  A Task<TResult> representing the asynchronous operation. The task result contains the same Medicine instance that was passed in, after the update operation has been issued.